2012-04-10 55 views
0

我试图在java中“查找”非常特定的一系列字符,但是我的正则表达式无法正常工作。我想查找一个单词(任何单词),然后是一个空格,然后是一个正向空格,然后是另一个空格,然后是'M'(小写或大写),然后是一系列数字。我正在使用以下行:使用正则表达式找不到一个单词

Elements rating = doc.getElementsMatchingText(Pattern.compile("\\b\\s/\\s[mM][0-9]+")); 

但是,这是查找整行(预期模式之前和之后的单词)。这也于事无补:

Elements rating = doc.getElementsMatchingText(Pattern.compile("^\\b\\s/\\s[mM][0-9]+"));  

我在做什么错?

+0

那么,你想从你提供的模式中得到什么?您没有任何捕获组,因此您只能检查模式是否在某些文本中找到,而不是从生成的匹配器中提取特定数据。 – 2012-04-10 16:09:24

+0

尝试'\ w +'而不是'\ b'。 – jon 2012-04-10 16:10:30

+0

请勿发布ddoouubbllee - eessccaappeedd Java。发布您的预期输入和您的预期结果,以及您正在使用的模式。 – tchrist 2012-04-10 16:20:54

回答

-1

关于正则表达式,尝试用:

* \ [MM] [1-9] *

我用http://rubular.com/测试我正则表达式,所以你可以让你的实验。

再见

+0

为什么有人会使用Ruby来测试Java模式? – tchrist 2012-04-10 16:21:38

+0

首先,因为它是我发现的第一个正则表达式测试器:P我认为java和ruby中的基本级正则表达式是相同的。 – Simone 2012-04-11 09:41:18

+0

我修改了我的java正则表达式。* \\ [Mm] [1-9] *。*,它似乎工作,但它找到了整条线。我不是专家,所以对我的回答感到抱歉 – Simone 2012-04-11 09:50:25

2

您的情况下,正确的模式是\\b\\w+\\s/\\s[mM][0-9]+

但是,您描述的问题与您使用的API相关,而不是与模式相关。 请注意,getElementsMatchingText不允许您访问匹配详细信息,因此您无法提取与该模式匹配的部分文本。

您需要手动遍历doc的所有元素,并应用Matcher.find()每个元素的文本,或者干脆重新申请Matcher.find()用相同的模式,以通过getElementsMatchingText返回元素的文本。然后你就可以将匹配的部分提取为Matcher.group()

+1

我不认为模式看起来正确;例如,'\ b \ s'只会匹配一个Unicode字符后面的ASCII空格。 – tchrist 2012-04-10 16:23:28

0

你的正则表达式是有缺陷的。我建议

\w+/[Mm]\d+ 

(记得要适当地逃跑的时候你把一个java字符串)

有几件事情对你的正则表达式:

1)您没有什么目前匹配“单词(任何单词)”(!!!)我选择了\ w +以仅与至少一个单词字符匹配单词。您可以执行像\ w {2,10}这样的操作来处理2到10个字符之间的单词,例如,如果您想进一步自定义。

2)你并不需要在所有因为\ W *匹配只匹配有效字字符

3 \ B)牢记\ S可以匹配不仅仅是一个空间更多..我只使用一个空间,但可以把在\■如果确定与它匹配的选项卡,新的线(如果配置这样)等

4)我认为\ d是更惯用的和比可读[0-9]

+1

这没有任何意义。所谓的不捕捉团体完全无关紧要。 – tchrist 2012-04-10 16:20:07

+0

@tchrist - doh,你说的\ b表达式是正确的。也许本应该从头开始,清醒头脑,而不是调整表达式:)。将编辑,谢谢! – 2012-04-10 16:26:17

+0

至于你的观点2,'\ b \ w + \ b'和'\ w +'之间确实存在细微的差别:前者要求边界在两边,后者不需要边界,所以在复杂的情形下匹配像“peek”这样的字符串的内部,就像double-e一样。前者不能。然而,Java的''b'和'\ w'(和'\ s'等)**相对于另一个**是完全被破坏的,除非你使用新的Java-7'UNICODE_CHARACTER_CLASS'或嵌入的'( ?U)'模式编译标志。 – tchrist 2012-04-10 16:44:12

相关问题