Java regex: [^(\\s?-\\s?)].PatternSyntaxException on 's'?



我今天刚开始学习java正则表达式,所以请原谅我采取了一种相当懒惰的方法来学习我的正则表达式有什么问题。基本上,我试图在"空白",-,"空白"模式(其中空白是一个或一个)上分割字符串,我不确定为什么模式没有编译。在[^(s?-s?)](索引8)中,第二个s出错了。如果有人能帮助我,我将非常感激!

您正在将您的模式放置在一个否定的字符类中,其中它正在做与您期望它做的完全相反的事情。

[^(s?-s?)]  # matches any character except: 
                  # '('
                  # whitespace (n, r, t, f, and " ") 
                  # '?'
                  # '-'
                  # whitespace (n, r, t, f, and " ")
                  # '?'
                  # ')'

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

修复编译问题,您只需转义连字符,但此regex仍不能满足您的要求。

我试图分割字符串上的空白,-,空白模式

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

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

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

  • Regular-Expressions.info
  • RexEgg教程

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

也许你的意思是用括号代替大括号?

最新更新