Notepad++ 困难的正则表达式

Notepad++ 困难的正则表达式

假设我有如下文本文档

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 位数字)

而外面的部分是负向前瞻。在这里尝试

相关内容