2013-08-19 117 views
0

我有一系列字符串,我正在寻找特定的字符组合。我正在查找一个数字,后跟字母m或M,后跟一个数字数字,然后是字母f或F.Java /正则表达式 - 在字符串中的任意位置查找字符

一个示例字符串是 - “Class(4)1m5f好” - 粗体文本是我想要从字符串中提取的内容。

这是我有的代码,这是行不通的。

Pattern distancePattern = Pattern.compile("\\^[0-9]{1}[m|M]{1}[0-9]{1}[f|F]{1}$\\"); 
Matcher distanceMatcher = distancePattern.matcher(raceDetails.toString()); 
while (distanceMatcher.find()) { 
String word= distanceMatcher.group(0); 
System.out.println(word); 
} 

任何人都可以建议我做错了什么?

+4

删除'^'和'$'... – devnull

+0

也,你不在字符类之后不需要“{1}”。 '[0-9]'本身意味着“一次”。 – mavili

回答

1

我会用字边界\b

\b\d[mM]\d[fF]\b 

对于Java,反斜线进行转义:

\\b\\d[mM]\\d[fF]\\b 

{1}是多余的
[m|M]意味着m|M

+0

需要在Java中跳过斜线(“\\ b \\ d [mM] \\ d [fF] \\ b”),但除此之外,完美无缺。谢谢。 – user2254180

+0

@ user2254180:良好的捕获,纠正。 – Toto

0

对于r a digit, following by the letter m or M, followed by a digit, then followed by the letter f or F正则表达式的equirement可以简化为:

Pattern distancePattern = Pattern.compile("(?i)\\dm\\df"); 

其中:

(?i) - For ignore case 
\\d - For digits [0-9] 
3

在你的正则表达式的开始和结束的^$字符anchors - 他们限制你的字符串,只有由你正在寻找的模式组成。第一步是删除这些。

然后,您可以使用word boundaries\b)来限制你要找的是一个完整的字,像这样的格局:

Pattern distancePattern = Pattern.compile("\\b\\d[mM]\\d[fF]\\b"); 

...或者,如果你不介意你图案出现在一个字的中间,如 “类(4)a1m5f好”,你可以删除单词边界:

Pattern distancePattern = Pattern.compile("\\d[mM]\\d[fF]"); 

快速笔记:

  • 你并不是真的需要{1} s - 默认假设 是一个字符或字符类出现一次。
  • 你可以用 替换[0-9]字符类用\d(这意味着相同的 东西)。
  • 这两个环节都regular-expressions.info,对学习正则表达式一个很好的资源,我强烈建议你看看:)
+0

神奇的解释,真的很感激它。 – user2254180

相关问题