【问题标题】:RegEx Pattern not matching in JAVA [duplicate]JAVA中的RegEx模式不匹配[重复]
【发布时间】:2017-06-12 03:00:39
【问题描述】:

我想知道为什么这个正则表达式组在 JAVA 中不适合我?查找组匹配时抛出异常。我正在尝试匹配由破折号分隔的数字。

Pattern p = Pattern.compile("([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)");
Matcher matcher = p.matcher("1-1-3-1-4");
matcher.group(0); // Exception happens here - java.lang.IllegalStateException: No match found

【问题讨论】:

  • 没有。你能否指出,如果有什么具体的原因导致这个问题?
  • 使用matcher() 实际上并没有尝试匹配任何东西。它只是设置了匹配器。您必须告诉它尝试与 Matcher methods 之一匹配。
  • 使用matcher.find() 遍历所有的事件。
  • 这就是他使用group做的事情
  • @f.khantsis Have a look at this

标签: java regex


【解决方案1】:

您需要致电Matcher#find() 才能真正获得匹配:

Pattern p = Pattern.compile("([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)");
Matcher matcher = p.matcher("1-1-3-1-4");
if (matcher.find()) {
    System.out.println(matcher.group(0))
}

如果您希望有多个匹配项,则可以使用 while 循环而不是 if 语句。

还请注意,您的模式中实际上有 五个 捕获组。捕获组通过将模式的一部分放在括号中来表示。如果您不打算/不需要单独捕获模式中的五个分隔数字,那么您可以考虑告诉正则表达式引擎 not 来捕获它们,例如使用这个:

Pattern p = Pattern.compile("(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)");

Demo

【讨论】:

  • 它应该匹配这个模式但是,对吧?
  • 组零匹配整个模式。除此之外,您还有五个捕获组。如果你能告诉我们更多关于你在这里尝试做什么,我可以更新我的答案。
  • 好吧,我明白了,在使用 matcher.find() 之后它对我有用。谢谢:)
【解决方案2】:

在 Java 正则表达式中,indexstudy 方法用于返回 Matcher 类匹配:

if (matcher.matches()) {
    System.out.println(matcher.group(0));
}

在上面的示例中,matches()"study" 方法尝试将整个区域与给定的模式进行匹配。您使用哪种方法通常表明您想要匹配什么/如何匹配。

matches()

尝试将整个区域与模式匹配。

find()

尝试查找输入序列的下一个子序列 匹配模式。

研究方法检查输入字符串并返回一个布尔值,指示是否找到模式

http://docs.oracle.com/javase/tutorial/essential/regex/matcher.html

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多