正则表达式\ w字符类和等号

时间:2016-03-08 11:00:48

标签: java regex equals

我正在创建一个匹配字符串

的正则表达式
  

@servername:端口:数据库名称

并通过https://regex101.com/我想出了

  

\ @(((\ W + * - *)+)\ W +。?)(:\ d +)(:\ W +)

匹配

e.g。 @ CORA-PC:1111:databasename或@ 111.111.1.111:111:databasename

但是当我在我的java代码中使用这个正则表达式进行模式匹配时,String @ CORA-PC:1111:database = name也匹配。

为什么\ w匹配=等号?我也试过[0-9a-zA-Z],但它也匹配=等号?

任何人都可以帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

.*是一个贪婪的点匹配子模式,它匹配整行,然后回溯以适应后续的子模式。这就是为什么模式可以匹配=符号(参见demo - 第3组将该部分与=匹配)。

您的模式相当脆弱,因为第一部分包含带有可选子模式的嵌套量词,这会减慢正则表达式的执行速度causes other issues。你需要使它更加线性。

@(\w+(?:[-.]\w+)*)?(:\d+)(:\w+)

请参阅regex demo

正则表达式匹配

  • @ - @符号
  • (\w+(?:[-.]\w+)*)? - 可选的组匹配
    • \w+ - 1 + word chars
    • (?:[-.]\w+)* - -.[-.])的0 +序列后跟1 +字词
  • (:\d+) - :符号后跟1+位数
  • (:\w+) - 一个:符号后面跟着1个字的字符

如果您需要避免部分匹配,请使用String#matches()(请参阅demo)。

注意:在Java中,反斜杠必须加倍。

代码示例(Java):

String s = "@CORA-PC:1111:databasename";
String rx = "@(?:\\w+(?:[-.]\\w+)*)?:\\d+:\\w+";
System.out.println(s.matches(rx));

代码示例(JS):



var str = '@CORA-PC:1111:databasename';
alert(/^@(?:\w+(?:[-.]\w+)*)?:\d+:\w+$/.test(str));