0

嗨,我试图让 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

我试图让一切 从Td喜欢Tj

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)

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

4

2 回答 2

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);
}

正则表达式负面环顾四周是矫枉过正。

于 2013-01-27T10:34:03.507 回答
1

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

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

如果单词 'PURCHASE' 出现在 next 之前,则前瞻会阻止匹配)

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

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

您正在捕获似乎也很奇怪(Td \()-捕获将永远是Td (,那何必呢?第二次捕获将开始/和结束Tj)- 这是你想要的吗?

我假设你知道你可以[/]\/[.]替换\.

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

@"(?![^\)]*PURCHASE)Td \(([^\)]*\/[^\)]*\.[^\)]*)\) Tj";
于 2013-01-27T16:06:41.827 回答