【发布时间】:2015-06-16 17:52:41
【问题描述】:
我正在过滤 SQL 脚本中包含某些人员 ID 的行。就我的目的而言,在过滤时过分热心比在过滤下要好,但我还是要小心一点。
例如,如果其中一个人员 ID 是 123,并且一行包含 [blob_id] = 123,我不想将其过滤掉。所以,我想找到123(两边都有单词分隔符),只要它前面没有[<some_id_here>] = 或<some_id_here> = person_id。
正则表达式应匹配以下每一行:
123
[person_id] = 123
blah,blah,123,blah
而且它不应该匹配以下每一行:
foo123bar
[blob_id] = 123
我认为这个正则表达式会起作用:
(?<!\[(?!person_id)\] = )\b123\b
外部否定后视表示“字符串前面不能有[<some_id_here>] =”。内部前瞻表示“此字符串可以匹配除person_id 之外的任何内容。我认为双重否定意味着“如果此字符串前面有[<some_id_here>] =,<some_id_here> 只能是person_id。
不幸的是,情况似乎并非如此。它适用于我所有的测试用例,除了[blob_id] = 123。
我相信正在发生的事情是,由于某种原因,由于双重否定,外部后视匹配任何东西。
这是我的regex101 link 和我的测试用例。
【问题讨论】:
-
您是否按照 regex101 链接的建议使用 PCRE?
-
我不确定你的意思。在我的程序中使用它之前,我在网站上对其进行了测试,甚至在让它在那里工作时遇到了麻烦。
-
换句话说:您使用什么语言?
-
我将使用 C#。我想我刚刚找到了一个替代的正则表达式来完成我想要的。
((?<!\] = )|(?<=\[person_id\] = ))\b123\b -
如果您查看我的回答,您就会明白为什么标记语言对于正则表达式问题真的很重要。如果我知道你预先使用 C#,我开始写一个完全不同的答案。 :-)