2013-08-06 102 views
1

我目前需要弄清楚如何使用正则表达式,并得出了一个我似乎并没有弄清楚的地方: 作为源的测试字符串(它们实际上来自OCR' d PDFs):获取字符串与尾随空格后字符串

string1 = 'Beleg-Nr.:12123-23131'; // no spaces after the colon 
string2 = 'Beleg-Nr.: 12121-214331'; // a tab after the colon 
string3 = 'Beleg-Nr.:  12-982831'; // a tab and spaces after the colon 

我想要显式地获取数字。对于我使用这个模式:

pattern = '/(?<=Beleg-Nr\.:[ \t]*)(.*) 

这将让我string1string2纯数字,但不工作的string3(它给我的号码前额外的空格)。

我在这里错过了什么?

编辑:感谢所有有用的建议。 OCR正在运行的软件能够在正则表达式中自行抑制空白。这个伎俩。所得图案是:

(?<=Beleg-Nr\.:[\s]*)(.*) 
+6

等待,你只想数字吧?那么就使用 - '(\ d +) - (\ d +)$'? –

+0

我在那里增加了\ t。编辑 – Sebastian

回答

0

只是用更多限制的图案([^ ]+$例如)取代(.*)。还要注意,Beleg-Nr之后的.也与其他字符匹配。

在我的例子中$匹配行的末尾,从而确保所有字符都被匹配。

我建议以匹配选项卡以及:

pattern = '/(?<=Beleg-Nr\.:[ \t]*)([^ \t]+)$ 
3

您可以使用“\”特殊符号,包括空间和标签(这样,你不需要它结合成通过组[])。

2

问题是[ ]*会匹配只有空格。您需要使用\s将匹配任何空白字符(更具体\s[\f\n\r\t\v\u00A0\u2028\u2029]):

/(?<=Beleg-Nr.:\s*)(.*)/ 

旁注: *是默认的贪婪,所以它会尝试尽可能匹配空格的最大数量,所以你在最后的()组中不需要使用否定[^\s]

+0

这适用于我的2个测试文档。但不知何故,客户文档仍然混乱,数字之前有空白。 – Sebastian

+0

你能举一个非工作条目的例子吗? – mishik

+0

那么,\ s'的存在取决于使用哪个正则表达式实现,对吧? – urzeit