一段时间后获得正则表达式失败

时间:2017-01-17 09:17:07

标签: java regex

我有一个特殊的正则表达式,在大约15-20天后失败。我使用的正则表达式是:

^[^-\\s][a-zA-Z0-9 ]*[[a-zA-Z0-9 !_|,ÄÖÜäöü߀:;\'~`\\?$%^*{}()=/@./#&><+-]+.*\\r\\n]+$

条件是:仅允许第一个单词中的数字和字母。任何事情都可以遵循。它不仅仅是空间。也允许使用德语字符。允许所有特殊字符。

我在日志中收到以下错误:

Stack trace: java.util.regex.Pattern$Curly.match0(Pattern.java:4170)
java.util.regex.Pattern$Curly.match(Pattern.java:4132)
java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
java.util.regex.Pattern$CharProperty.match(Pattern.java:3694)
java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
java.util.regex.Pattern$Curly.match0(Pattern.java:4170)
java.util.regex.Pattern$Curly.match(Pattern.java:4132)
java.util.regex.Pattern$Pos.match(Pattern.java:4965)
java.util.regex.Pattern$Curly.match0(Pattern.java:4170)
java.util.regex.Pattern$Curly.match(Pattern.java:4132)
java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
java.util.regex.Pattern$CharProperty.match(Pattern.java:3694)
java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
java.util.regex.Pattern$Curly.match0(Pattern.java:4170)
java.util.regex.Pattern$Curly.match(Pattern.java:4132)
java.util.regex.Pattern$Begin.match(Pattern.java:3472)
java.util.regex.Matcher.match(Matcher.java:1221)
java.util.regex.Matcher.matches(Matcher.java:559)
java.util.regex.Pattern.matches(Pattern.java:1130)

2 个答案:

答案 0 :(得分:0)

您的正则表达式可以简化为(?ums)^[a-zA-Z0-9]+ [^ ]+$

说明:

  • [a-zA-Z0-9]+ - >以符号开头:a-zA-Z0-9
  • - 空格作为单词之间的分隔符
  • [^ ]+ - 除空格外的任何符号

标志:

  • u - 允许unicode符号
  • m - 多行
  • s - dotall模式(匹配任何字符,包括行终止符)

试验:

public void testRegExp() {
    String regex = "(?ums)^[a-zA-Z0-9]+ [^ ]+$";
    Assert.assertTrue("iuy98 ÄÖ\r\nÜäöüß7".matches(regex));
    Assert.assertTrue("iuy 98ÄÖÜäöüß7*&^&%*$&".matches(regex));
    Assert.assertFalse("iuy98Ä ÖÜäöü\r\nß7*&^&%*$&".matches(regex));
    Assert.assertFalse("i u y98ÄÖÜäöüß7*&^&%*$&".matches(regex));
    Assert.assertFalse("  iuy98ÄÖÜäöüß7*&^&%*$&\r\n".matches(regex));
    Assert.assertFalse("00uy98ÄÖÜä öüß7*&^&%*$&".matches(regex));
    Assert.assertFalse("00uy98ÄÖÜä öüß7*&^&%*$&".matches(regex));
    Assert.assertFalse("$%^&00uy98ÄÖÜä öüß7*&^&%*$&".matches(regex));
    Assert.assertTrue("00uy98 ÄÖÜ____äöüß\r\n7*&^&%*$&".matches(regex));
    Assert.assertTrue("00uy98 ÄÖÜ____äöüß\r\n7*&^&%*$&".matches(regex));
    Assert.assertTrue("00 uy98{}[]ÄÖÜ____äöüß\r\n7*&^&%*$&".matches(regex));
}

答案 1 :(得分:0)

  

仅允许第一个单词中的数字和字母。任何事情都可以遵循。它不仅仅是空格。

这个应该做的工作:

^[a-zA-z0-9]+\\S+$

\S代表任何非空格字符。