【问题标题】:Regex to find instances of a string pattern that is not preceded by a carriage return/line feed正则表达式查找前面没有回车符/换行符的字符串模式的实例
【发布时间】:2023-03-18 08:06:02
【问题描述】:

我在记事本++中工作

在我正在使用的文件中有一个[0-9][0-9]-[0-9][0-9][0-9][0-9]| 的字符串模式,每一行都应该以它开头,紧接着是一个管道。 (这里需要注意的是:该模式在四位数字之后最多可以有三个大写字母。例如 00-1324A| 或 12-3456STR|)。

文件中存在该模式位于一行中间的实例,需要移至下一行。

例子:

00-1234REV|The quick brown fox jumped over the lazy dog|Test
11-6544|FooBar|text99-8656ST|This needs to be on the next line|some text
45-8737|Peter pipe picked a peck of pickled peppers|TEST2

正如我在示例中所指出的,99-8656ST 需要移至下一行,结果如下:

00-1234REV|The quick brown fox jumped over the lazy dog|Test
11-6544|FooBar|text
99-8656ST|This needs to be on the next line|some text
45-8737|Peter pipe picked a peck of pickled peppers|TEST2

我目前有这个正则表达式:(?<=[^\d\r\n])\d{2}-\d{4}(?!\d),但这与一行中间的部分社会安全号码相匹配:

123-45-6789

我的正则表达式将在 45-6789.

【问题讨论】:

  • 使用数字边界然后(?<=[^\d\r\n])(?<!\r\n)\d{2}-\d{4}(?!\d),见regex101.com/r/G3JocW/2
  • 您可以使用这个正则表达式:(?<!^|\d)[0-9][0-9]-[0-9][0-9][0-9][0-9](?!\d) 记得在 Notepad++ 查找和替换工具上激活多行模式。
  • @WiktorStribiżew,这会跳过电话号码,但在 SSN 上仍然匹配
  • @horcrux,Notepad++ 抱怨这是一个无效的正则表达式
  • 请更新问题以查看数字边界在哪里失败。实际上,在我的正则表达式中,(?<!\r\n) 变得多余并且可以被删除。 (?<=[^\d\r\n])\d{2}-\d{4}(?!\d) 会起作用。

标签: regex notepad++


【解决方案1】:

由于纯数字边界在这里不起作用,您可以在左侧添加一个数字 + 连字符的检查。右侧边界清晰,零到三个大写字母后跟一个竖线。

也就是说,你可以使用

(?<=[^\d\r\n])(?<!\d-)\d{2}-\d{4}(?=[A-Z]{0,3}\|)

请参阅regex demo详情

  • (?&lt;=[^\d\r\n]) - 紧靠左边,必须有除数字、CR、LF 以外的字符
  • (?&lt;!\d-) - 紧靠左边,应该没有数字 + -
  • \d{2}-\d{4} - 两位,-,四位
  • (?=[A-Z]{0,3}\|) - 紧跟 0 到 3 个大写字母,然后是文字 | 字符。

如果左侧边界可以是单个连字符或数字,则将 (?&lt;=[^\d\r\n])(?&lt;!\d-) 替换为 (?&lt;=[^\r\n\d-])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2011-02-11
    • 2011-07-01
    相关资源
    最近更新 更多