【问题标题】:Java regex first match onlyJava 正则表达式仅第一次匹配
【发布时间】:2013-09-16 23:19:12
【问题描述】:

如何告诉下面的正则表达式只找到第一个匹配项?以下代码不断在字符串中查找所有可能的正则表达式。

即我只寻找子字符串 (200-800;50]

的索引
public static void main(String[] args) {

    String regex = "(\\[|\\().+(\\]|\\))";

    String testName=  "DCGRD_(200-800;50]MHZ_(PRE|PST)_(TESTMODE|REG_3FD)";

            Pattern pattern = 
            Pattern.compile(regex);

            Matcher matcher = 
            pattern.matcher(testName);

            boolean found = false;

            while (matcher.find()) {
                System.out.format("I found the text" +
                    " \"%s\" starting at " +
                    "index %d and ending at index %d.%n",
                    matcher.group(),
                    matcher.start(),
                    matcher.end());
                found = true;

            }

            if (!found){
                System.out.println("Sorry, no match!");
            }
}

【问题讨论】:

  • 第一个匹配项将是循环的第一次迭代。只需处理一次迭代即可。或者根本没有循环,如果 find 返回 true 则简单地处理匹配。
  • 这就是我要找的。谢谢
  • 你的正则表达式匹配(200-800;50]MHZ_(PRE|PST)_(TESTMODE|REG_3FD)。您需要正则表达式方面的帮助吗?
  • 我只需要第一次出现。即(200-800;50]。搞定了一切! :)

标签: java regex string


【解决方案1】:

matcher.group(1) 将返回第一个匹配项。

如果您的意思是惰性匹配而不是急切匹配,请尝试添加 ?在正则表达式中的 + 之后。

或者,您可以考虑使用比.+ 更具体的内容来匹配括号之间的内容。如果您只需要字母、数字和几个字符,那么 [-A-Z0-9;_.]+ 之类的可能会更好?

【讨论】:

  • matcher.group(1) 返回的是第一个捕获组(\[|\() 的内容。所以它将是([,在这个特定的例子中它总是(,因为所有三个可能的匹配都以它开头。 (group(2) 将返回 ]` 或 )。)无论如何,不​​情愿或更具体的建议似乎是 OP 正在寻找的,所以 +1。
  • 等等... matcher.group(0) 不应该返回第一个匹配项吗?
  • 你可能直观地认为,但第 0 组实际上返回了整个匹配的表达式。
猜你喜欢
  • 2018-06-28
  • 2022-01-11
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多