【问题标题】:Java regex: [^(\\s?-\\s?)]. PatternSyntaxException on 's'?Java 正则表达式:[^(\\s?-\\s?)]。 's' 上的 PatternSyntaxException?
【发布时间】:2014-09-26 10:44:49
【问题描述】:

我今天刚开始学习 Java 正则表达式,所以请原谅我采取了一种相当懒惰的方法来了解我的正则表达式有什么问题。基本上,我试图在“空白”、“-”、“空白”模式(其中空白是一个或没有)上拆分一个字符串,但我不确定为什么该模式没有编译。我在第二个 s 中收到错误:[^(\s?-\s?)](索引 8)。如果有人可以帮助我,我将不胜感激!

【问题讨论】:

  • [] 在正则表达式中的含义是什么?
  • 我希望我能回答这个问题,但我什至不确定我为什么要使用它哈哈

标签: java regex string patternsyntaxexception


【解决方案1】:

您将尝试拆分的模式放在否定的character class 内部,其中它的作用与您期望的完全相反。

[^(\s?-\s?)]  # matches any character except: 

                  # '('
                  # whitespace (\n, \r, \t, \f, and " ") 
                  # '?'
                  # '-'
                  # whitespace (\n, \r, \t, \f, and " ")
                  # '?'
                  # ')'

您的语法确实不正确,但是 why will it not compile? 好吧,在字符类中,连字符具有 特殊 含义。您可以将连字符作为类的第一个或最后一个字符。在某些正则表达式实现中,您还可以直接放在范围之后。如果您将连字符放在其他任何地方,您需要将其转义才能将其添加到您的课程中。

修复编译问题,您只需将连字符转义即可,但此正则表达式仍不能满足您的要求。

我正在尝试在空格、-、空格模式...

上拆分字符串

从模式中移除字符类和捕获组:

String s = "foo - bar - baz-quz";
String[] parts = s.split("\\s?-\\s?");
System.out.println(Arrays.toString(parts)); //=> [foo, bar, baz, quz]

这里有一些学习正则表达式的参考。

【讨论】:

  • 感谢 m8。您像冠军一样回答了这个问题!
【解决方案2】:

\s 是一个字符类。 [] 内的字符被视为那些字符。 (或者在 [^] 的情况下不是特定字符)。在 [] 中使用 \s 是没有意义的。

也许您的意思是使用括号而不是大括号?

【讨论】:

  • 括号允许表达式编译,但预期的效果不存在......有什么想法吗?
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多