您好我试图让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)
对于我的正则表达式而且它可以获得所有内容,但它甚至可以“购买”
答案 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";