Regex 如何从正则表达式中排除字符串,以便如果字符串出现在文本行中,它不会返回匹配项?

Regex 如何从正则表达式中排除字符串,以便如果字符串出现在文本行中,它不会返回匹配项?,regex,Regex,我知道以前也有人问过类似的问题,但我无法找到解决方案。就是这个 这是课文 ID Type Code Test Name Dept Date --- Time --- By ---- ---- ---------- ------------------------- ------ -------- -------- 01 S 10231AB=,+ Test1 With Spaces 20180913

我知道以前也有人问过类似的问题,但我无法找到解决方案。就是这个

这是课文

     ID   Type    Code    Test Name                  Dept    Date --- Time --- By
 ---- ---- ---------- ------------------------- ------ -------- --------

 01     S  10231AB=,+ Test1 With Spaces       20180913  1:08 AM ENIG01
 02     S  %SBTEX1    Test2 With Spaces       20180912 10:02 AM MYR001
 03     B  6399AB=    Test3 With Spaces       20180912 12:07 AM WDHLSY1
 04     S  4848AB=,4+ Test4 With Spaces       20180912 12:07 AM WDHLSY1
 05     S  899AB=,+   TSH+                    20180913  1:08 AM ENIG01
 06     S  899AB=,+   TSH+  
第1行和第2行不匹配,因为包含文本“10231”和“%SBTEX1”

第五行是比赛

第6行不匹配,因为它没有诸如“20180913”之类后跟日期和时间的数字字符串

我试过了,但甚至不能找到一个正则表达式来匹配除第6行之外的所有代码行

这是上面提到的帖子中的正则表达式。它排除了包含单词的代码行

^((?!hede).)*$
问题是:

对解决了我最初问题的维克托·斯特里比奥(Wiktor Stribiżew)大喊一声。但我遗漏了一些文字,当我试图实现他的解决方案时,我意识到问题比我最初想象的更复杂

如果您想了解他对原始问题的解决方案,请访问下面的链接

如果可以的话。请再次将您的解决方案发布在RegexStorm.Net/Tester上,这太棒了

谢谢,

标记S.

您可以使用

(?m)^\d+\s+\w\s+\d+(?<!\s(?:10231|91431))\r?$
(?m)^\d+\s+\w\s+\d+(?
看

我假设行不是以空格开头的,所以我从模式中删除了首字母
\s+
,并添加了
^
作为行锚的开头(如
(?m)
修改
^
$
的行为,从而使
\r?
在CRLF行结尾处匹配所必需的
$
。)

图案细节

  • (?m)
    -
    ^
    现在匹配行首,
    $
    匹配行尾
  • ^
    -行的开头
  • \d+
    -1+位
  • \s+
    -1+空格(替换为
    [\p{Zs}\t]+
    以仅匹配水平空格(
    [^\s\r\n]+
    也可以)
  • \w
    -一个单词char
  • \s+
    -1+空格
  • \d+
    -1+位
  • (?-a如果在当前位置的左侧有一个空格和两个数值中的任何一个,则匹配失败的负查找
  • \r?$
    -可选CR和线锚末端
您可以使用

(?m)^\d+\s+\w\s+\d+(?<!\s(?:10231|91431))\r?$
(?m)^\d+\s+\w\s+\d+(?
看

我假设行不是以空格开头的,所以我从模式中删除了首字母
\s+
,并添加了
^
作为行锚的开头(如
(?m)
修改
^
$
的行为,从而使
\r?
在CRLF行结尾处匹配所必需的
$
。)

图案细节

  • (?m)
    -
    ^
    现在匹配行首,
    $
    匹配行尾
  • ^
    -行的开头
  • \d+
    -1+位
  • \s+
    -1+空格(替换为
    [\p{Zs}\t]+
    以仅匹配水平空格(
    [^\s\r\n]+
    也可以)
  • \w
    -一个单词char
  • \s+
    -1+空格
  • \d+
    -1+位
  • (?-a如果在当前位置的左侧有一个空格和两个数值中的任何一个,则匹配失败的负查找
  • \r?$
    -可选CR和线锚末端

这个问题的答案是:

(?m)(?>^[\t\p{Zs}]*\d+\s+S\s+\S+)(?<!\s\S*(?<!\d)(?:10231|%SBTEX1)(?!\d)\S*).+\d+[\p{Zs}\t]+\d+
因此,我用[\p{Zs}\t]+替换了这个正则表达式末尾的\s+,得到了解决我的特定问题的答案。再一次,它是:

(?m)(?>^[\t\p{Zs}]*\d+\s+S\s+\S+)(?<!\s\S*(?<!\d)(?:10231|%SBTEX1)(?!\d)\S*).+\d+[\p{Zs}\t]+\d+
(?m)(?>^[\t\p{Zs}]*\d+\s+s\s+\s+(?)?
我还鼓励任何需要将任何文本字符串排除在正则表达式匹配之外的人根据自己的需要操作此解决方案


谢谢Wiktor。没有您的帮助,我无法获得此解决方案!

此特定问题的答案是:

(?m)(?>^[\t\p{Zs}]*\d+\s+S\s+\S+)(?<!\s\S*(?<!\d)(?:10231|%SBTEX1)(?!\d)\S*).+\d+[\p{Zs}\t]+\d+
因此,我用[\p{Zs}\t]+替换了这个正则表达式末尾的\s+,得到了解决我的特定问题的答案。再一次,它是:

(?m)(?>^[\t\p{Zs}]*\d+\s+S\s+\S+)(?<!\s\S*(?<!\d)(?:10231|%SBTEX1)(?!\d)\S*).+\d+[\p{Zs}\t]+\d+
(?m)(?>^[\t\p{Zs}]*\d+\s+s\s+\s+(?)?
我还鼓励任何需要将任何文本字符串排除在正则表达式匹配之外的人根据自己的需要操作此解决方案


谢谢Wiktor。如果没有你的帮助,我不可能得到这个解决方案!

这真的很好,但我可能应该包括全文。我正在尝试在我真的试图找到答案的文本上尝试,但我无法让它工作。我明天会研究你的答案,看看是否能让它工作。如果不能,我将发布全文并你可能会得到它。我真的很感谢你的帮助!@MarkS:重点是找到一个地方,在那里你可以“锚定”限制环视,然后使用环视(如果是向前看,它必须在前面,向后看,正如你看到的,是在更通用的模式之后)。也可以使用。如果我需要继续使用正则表达式,该怎么办?我可以在查看后继续添加吗?@MarkS是的,请尝试。如果有问题,请告知。我更新了问题Wiktor。我今天早上上班,已经尝试了一个小时,但不幸的是,这个问题超出了我使用Regex的能力。我相信你会找到答案的。提前感谢你的支持!这真的很好,但我可能应该包括全文。我正在试着找到答案,但我无法找到答案。我明天会研究你的答案,看看我是否能让它起作用。如果不能,我会发布全文,你会看到我很有可能得到它。我真的很感谢你的帮助!@MarkS:重点是找到