【问题标题】:Repetition seems to break my regex重复似乎打破了我的正则表达式
【发布时间】:2013-06-10 10:01:59
【问题描述】:

我正在用 java 编写一个解析器,并将问题缩小到我的一个正则表达式。在玩弄它并使案例变得更简单之后,我最终得到了一个简单的测试 .txt 文件:

read a

和一个看起来像这样的模式:

... = Pattern.compile("[a-zA-Z]+");

“read”在上一步中解析,然后我的程序抛出错误,因为“a”无法识别。我正在对输入进行标记,并且没有空格。我不得不将正则表达式缩减为:

[a-z]

让它匹配。如果我添加“+”或其他任何内容,它就会失败。有什么见解吗?

编辑:再次查看后,[a-zA-Z] 有效,它的“+”正在破坏它。

【问题讨论】:

  • 您的正则表达式没有问题。使用它/“引发错误”的代码就是问题所在。
  • 那么为什么“只匹配一次”会起作用而“匹配一次或多次”会失败?
  • 请发布您的实际 java 代码,包括您从哪里获取输入、标记并匹配。
  • 在您实际调用正则表达式之前立即打印您尝试匹配的字符串。您很可能会看到该字符串与"a" 不同(一个疯狂的猜测是该字符串是" a")。
  • 假设您使用 Scanner.next(Pattern p) 方法来标记您的输入,您的正则表达式是可以的。

标签: java regex parsing


【解决方案1】:

试试这个代码,它会匹配任何以字母开头的文本,带有可选数量的空格,然后是更多的字母。 它将在您的空格后打印整个匹配项和特定值。

Pattern pattern = Pattern.compile("\\w+\\s*?(\\w+)");
String test = "read a";
Matcher matcher = pattern.matcher(test);
if (matcher.find()) {
    System.out.println("WHOLE MATCH: " + matcher.group());
    System.out.println("VALUE AFTER SPACE: " + matcher.group(1));
}

输出:

WHOLE MATCH: read a
VALUE AFTER SPACE: a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多