如果整个单词在字符串中的任何位置,则RegEx忽略匹配

时间:2013-01-27 10:17:41

标签: c# .net regex regex-negation

您好我试图让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)

对于我的正则表达式而且它可以获得所有内容,但它甚至可以“购买”

2 个答案:

答案 0 :(得分:2)

你有什么好。正则表达式可以用于此..但为什么将一级方程式赛车放在卡丁车赛道上(< ---不好比喻......)浪费CPU周期?

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

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

正则表达式的负面外观对此非常有用。

答案 1 :(得分:1)

如果您想使用正则表达式来确保您的匹配不包含“PURCHASE”字样,您可以使用负面预测,例如:

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

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

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

仔细观察你的正则表达式,我注意到第二个([^\)]*)是多余的,因为它匹配的所有东西都会被它前面的([^\)]*)捕获。

您捕获(Td \()似乎很奇怪 - 捕获将始终为Td (,为什么还要费心?第二次捕获将从/开始,以Tj)结束 - 这是您的意图吗?

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

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

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