假设我有如下文本文档
1
M1577682
Wayne United States Minnesota Minneapolis 55 2019-10-31 14:51:05
2
M1527197
henrik Denmark Sjelland Koge 52 2019-10-31 14:29:53
3
M3455913
Kim Canada Ontario London 61 2019-10-30 21:36:03
4
M2040689
shapo Germany Hesse-Darmstadt Frankfurt 45 2019-10-31 13:19:12
我需要从该文本中创建一行如下所示的内容。
M1577682,M1527197,M3455913,M2040689
我发现这个^(?!。M1577682)(.?)$ 将选择不包含 M1577682 的任何内容。
并且这个 \bM\w{7,} 将选择以 M 开头并且后面有 7 个或更多字母的任何单词。(仍然选择 Minnesota 和 Minneapolis,我无法解决这个问题)
那么,我可以以某种方式将这两个正则表达式合并在一起,以选择所有不以 M 开头且有 7 位数字(字母)的内容并将其替换为逗号吗?
答案1
这是一种方法,之后您必须手动删除最后一个逗号。
- Ctrl+H
- 找什么:
(?:(?:(?!M\d{7}).)*|\G)(M\d{7})(?:(?!M\d{7}).)*
- 用。。。来代替:
$1,
- 查看 相符
- 查看 环绕
- 查看 正则表达式
- 查看
. matches newline
- Replace all
解释:
(?: # non capture group
(?: # non capture group
(?! # negative lookahead, make sure we haven't after:
M # the letter M
\d{7} # 7 digits
) # end lookahead
. # any character
)* # end group, may appaear 0 or more times
| # OR
\G # restart from last match position
) # end group
( # group 1
M # the letter M
\d{7} # 7 digits
) # end group 1
(?: # non capture group
(?! # negative lookahead, make sure we haven't after:
M # the letter M
\d{7} # 7 digits
) # end lookahead
. # any character
)* # end group, may appear 0 or more times
笔记:如果是这样的话,您可能需要添加单词边界,以便在正则表达式中的所有地方M\d{7}
替换。\bM\d{7}\b
屏幕截图(之前):
屏幕截图(之后):
答案2
如果格式是“M”后跟 7 位连续的数字,我们可以尝试匹配我们想要保留的内容,并使用以下正则表达式对其进行取反:
^(?!M[0-9]{7}).*
内部部分是
M
- 完全匹配“M”[0-9]
- 匹配包含数字零到九的列表中的单个字符。{7}
- 上述列表的量词(匹配 7 位数字)
而外面的部分是负向前瞻。在这里尝试!