【问题标题】:RegEx ignore a match if a whole word is anywhere in the string如果整个单词在字符串中的任何位置,RegEx 将忽略匹配
【发布时间】:2013-01-27 10:17:40
【问题描述】:

您好,我正在尝试使用 RegEx。我有这段文字:

/Ffont2 45.83 Tf  252 980 Td (XX7445 DDA PURCHASE 05/28 04:48
MCDONALD'S F561 CHICAGO IL 105/29          10.25) Tj ET
0.000000 0.000000 0.000000 rg 0.000000 0.000000 0.000000 RG BT /Ffont2 45.83 Tf  252 937 Td (   12333378 214904443) Tj ET
0.000000 0.000000 0.000000 rg 0.000000 0.000000 0.000000 RG BT /Ffont2 45.83 Tf  252 894 Td (CITI CARD ONLINE PAYMENT 12345678                    05/29          87.99) Tj ET
0.000000 0.000000 0.000000 rg 0.000000 0.000000 0.000000 RG BT /Ffont2 45.83 Tf  252 851 Td (XX7445 DDA PURCHASE 0528 14:11 #03632 JEWEL CHICAGO IL     0529          97.60) Tj ET

我试图得到从TdTj 的所有东西

Td (CITI CARD ONLINE PAYMENT 12345678                    05/29                87.99) Tj

但是如果它们没有日期,我想跳过它们(必须有正斜杠),它们必须有金额(必须有句点),如果里面有“购买”这个词,我不想要它。所以

Td (XX7445 DDA PURCHASE 0528 14:11 #03632 JEWEL CHICAGO IL     0529         97.60) Tj

不会被退回。现在我有

(Td \()([^\)]*)([^\)]*)([/][^\)]*[.][^\)]*\) Tj)

对于我的正则表达式,它得到了一切,但即使它有“购买”,它也会得到它

【问题讨论】:

  • 我希望那不是真实的卡号 + 到期..
  • (Td ([^)]*[/][^)]*[.][^)]*) Tj)
  • 我已经重新格式化了文本,请检查是否正确。

标签: c# .net regex regex-negation


【解决方案1】:

你所拥有的一切都很好。正则表达式可以用于此.. 但是为什么将一级方程式赛车放在卡丁车赛道上

var matchesWithoutPurchase = Regex.Matches(yourInput, @"(Td \()([^\)]*)([^\)]*)([/][^\)]*[.][^\)]*\) Tj)")
    .Cast<Match>().Where(x => !x.Value.ToLower().Contains("purchase"));

foreach (var match in matchesWithoutPurchase) {
    Console.WriteLine(match);
}

正则表达式否定环视对此太过分了。

【讨论】:

  • 谢谢!我知道我不需要为此使用正则表达式,但是在正则表达式之后已经有太多代码了,我很担心,我想如果可以的话我可以使用正则表达式。并且为了将来的参考,我想学习一种 godo 方式。但是谢谢这也很好
【解决方案2】:

如果您想使用正则表达式来确保您的匹配项不包含单词“PURCHASE”,您可以使用如下的否定前瞻:

@"(?![^\)]*PURCHASE)(Td \()([^\)]*)([^\)]*)([/][^\)]*[.][^\)]*\) Tj)"

如果单词“PURCHASE”出现在下一个) 之前,则前瞻会阻止匹配。

如果您还想阻止“购买”,您可以将(?i) 添加到正则表达式的开头,或者将RegexOptions.IgnoreCase 标志添加为Regex 方法调用的最后一个参数。

仔细查看您的正则表达式,我注意到第二个 ([^\)]*) 是多余的,因为它匹配的所有内容都将被紧接在它之前的 ([^\)]*) 捕获。

您正在捕获(Td \() 似乎也很奇怪 - 捕获将始终是Td (,那么为什么要麻烦呢?第二次捕获将以/ 开头并以Tj) 结尾 - 这是您的意图吗?

我假设您知道您可以将[/] 替换为\/,并将[.] 替换为\.

无论如何,要捕获括号内的内容,您可以使用:

@"(?![^\)]*PURCHASE)Td \(([^\)]*\/[^\)]*\.[^\)]*)\) Tj";

【讨论】:

  • 谢谢。我粘贴的正则表达式是在弄乱它以使负前瞻工作之后,并不是我真正在做什么。一开始的捕获组只是我在沮丧时添加的东西。不过感谢您的解决方案。这是一个家庭项目,我现在正在工作,我很高兴今晚下班时尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多