当前位置: 首页 > 知识库问答 >
问题:

JAVA中的RegEx模式不匹配[重复]

慕才
2023-03-14

我想知道为什么这个regex组在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

共有1个答案

奚昌胤
2023-03-14

您需要调用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语句。

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

Pattern p = Pattern.compile("(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)");
 类似资料:
  • 或者更好的方法是遍历它,为参数的每个索引获取TRUE或FALSE标志 我只知道如何使用matcher.find()进行循环,如果有任何帮助,我将不胜感激

  • 我是不是漏掉了什么?提前感谢!

  • 我对Regex还比较陌生,觉得我错过了一些重要的东西。 我的模式<code>id='([a-zA-Z0-9])IFrame[id='frame'].leftObject中获取单词“frame”。 这是我正在使用的模式和代码的链接。https://regex101.com/r/MmkGZq/2 这是否与C#中的正则表达式与Java中的正则表达式不同有关?

  • 我尝试进入调试模式,它似乎无法提取字符串的特定部分。我做错了什么?我的regex错了吗?它似乎与我尝试过的所有在线regex构建器/测试器相匹配。

  • 我有一个包含大量数据的文本文件,其中一些是天、小时、分钟和秒组合的时间。下面列出了示例。 例如: 2天3小时24分16秒 1天4分3秒 4小时17分56秒 4小时17秒 2小时3分钟 3分15秒 45秒 我试图将所有提到的时间替换为一个通用字符串,如“TimeString”。我已经编写了自己的正则表达式,但它并不像预期的那样工作 因此,随着时间的推移,所有的数字都会被替换。例如,如果显示“26个订

  • 问题内容: 我有一段代码无法在安装了Java 1.7的Eclipse上运行。 我想使用一个正则表达式来匹配并从每个匹配中提取2个字符串,因此我为此使用了2个组。 我已经在许多网站(在线正则表达式测试仪)上测试了我的表情,但对他们有用,但在Eclipse中的Java项目中却无法使用。 源字符串看起来像以下任何一个: 形式语言:isNatural 注释工具:isHuman%Human注释者:isHum