正则表达式 \w 字符 class 和等号
Regular Expressions \w character class and equals sign
我正在创建一个正则表达式来匹配字符串
@servername:port:databasename
通过 https://regex101.com/ 我想出了
\@(((\w+.*-*)+)?\w+)(:\d+)(:\w+)
匹配
例如@CORA-PC:1111:数据库名或@111.111.1.111:111:数据库名
然而,当我在我的 java 代码中使用此正则表达式进行模式匹配时,String @CORA-PC:1111:database=name 也会匹配。
为什么 \w 匹配 = 等号?我也试过 [0-9a-zA-Z] 但它也匹配 = 等号?
谁能帮我解决这个问题?
谢谢!
.*
是一个贪婪的点匹配子模式,匹配整行然后回溯以适应后续的子模式。这就是为什么该模式可以匹配 =
符号(请参阅 demo - 第 3 组将该部分与 =
匹配)。
您的模式相当脆弱,因为第一部分包含带有可选子模式的嵌套量词,这会减慢正则表达式的执行速度 causes other issues。你需要让它更线性。
@(\w+(?:[-.]\w+)*)?(:\d+)(:\w+)
正则表达式将匹配
@
- @
符号
(\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));
我正在创建一个正则表达式来匹配字符串
@servername:port:databasename
通过 https://regex101.com/ 我想出了
\@(((\w+.*-*)+)?\w+)(:\d+)(:\w+)
匹配
例如@CORA-PC:1111:数据库名或@111.111.1.111:111:数据库名
然而,当我在我的 java 代码中使用此正则表达式进行模式匹配时,String @CORA-PC:1111:database=name 也会匹配。
为什么 \w 匹配 = 等号?我也试过 [0-9a-zA-Z] 但它也匹配 = 等号?
谁能帮我解决这个问题? 谢谢!
.*
是一个贪婪的点匹配子模式,匹配整行然后回溯以适应后续的子模式。这就是为什么该模式可以匹配 =
符号(请参阅 demo - 第 3 组将该部分与 =
匹配)。
您的模式相当脆弱,因为第一部分包含带有可选子模式的嵌套量词,这会减慢正则表达式的执行速度 causes other issues。你需要让它更线性。
@(\w+(?:[-.]\w+)*)?(:\d+)(:\w+)
正则表达式将匹配
@
-@
符号(\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));