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

标签 java regex equals

我正在创建一个正则表达式来匹配字符串

@servername:port:databasename

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

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

匹配

例如@CORA-PC:1111:数据库名称或@111.111.1.111:111:数据库名称

但是,当我在 java 代码中使用此正则表达式进行模式匹配时,字符串 @CORA-PC:1111:database=name 也会匹配。

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

有人可以帮我解决这个问题吗? 谢谢!

最佳答案

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

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

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

请参阅regex demo

正则表达式将匹配

  • @ - @ 符号
  • (\w+(?:[-.]\w+)*)? - 可选的组匹配
    • \w+ - 1+ 个单词字符
    • (?:[-.]\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));

关于java - 正则表达式\w字符类和等号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35865568/

相关文章:

Java exec方法不执行程序

java - JButton 中的图像不显示

java - BigClip 无法播放 .wav 文件

java - 如何部署 webapp 并创建其资源

java - 在 equals 方法中类型转换

如果我们不使用 hashmap 或 hashset,则不需要 Java hashCode() 方法覆盖

用逗号或点对十进制数进行正则表达式验证

mysql - 使用正则表达式仅获取数字

不允许连续点的正则表达式

PHP : IF Domain equals EXACTLY [x] then [actions] but not subdirectories/files