0

我有一系列字符串,我正在其中搜索特定的字符组合。我正在寻找一个数字,后跟字母 m 或 M,后跟一个数字,然后是字母 f 或 F。

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

这是我的代码,它不起作用。

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

3 回答 3

3

正则表达式开头和结尾的 and 字符是锚点^-它们将您限制为仅包含您正在寻找的模式的字符串。第一步是删除那些。$

然后,您可以使用单词边界( \b) 将您要查找的模式限制为一个完整的单词,如下所示:

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

...或者,如果您不介意您的模式出现在单词中间,例如“Class (4) a1m5f Good”,您可以删除单词边界:

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

快速笔记:

  • 您实际上并不需要{1}s 无处不在 - 默认假设是一个字符或字符类只发生一次。
  • 您可以将[0-9]字符类替换为\d(意思相同)。
  • 这两个链接都指向regular-expressions.info,这是学习正则表达式的绝佳资源,我强烈建议您查看:)
于 2013-08-19T13:06:52.720 回答
1

我会使用单词边界\b

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

对于 java,反斜杠将被转义:

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

{1}是多余的
[m|M]手段m|M

于 2013-08-19T12:56:45.530 回答
0

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

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

在哪里:

(?i) - For ignore case
\\d  - For digits [0-9]
于 2013-08-19T12:58:47.407 回答