[英]Regular Expressions \w character class and equals sign
我正在創建一個正則表達式來匹配字符串
@servername:端口:數據庫名稱
並通過https://regex101.com/我想到了
\\ @(((\\ w + * - *)+)\\ w +?)(:\\ d +)(:\\ w +)
哪個匹配
例如@ CORA-PC:1111:databasename或@ 111.111.1.111:111:databasename
但是,當我在Java代碼中使用此正則表達式進行模式匹配時,字符串@ CORA-PC:1111:database = name也會被匹配。
為什么\\ w匹配=等號? 我也嘗試過[0-9a-zA-Z],但它也匹配了=等號?
誰能幫我這個? 謝謝!
.*
是貪婪點匹配子模式,它與整行匹配,然后回溯以適應后續的子模式。 這就是為什么模式可以匹配=
符號的原因(請參閱演示 -組3使用=
匹配該部分)。
您的模式相當脆弱,因為第一部分包含帶有可選子模式的嵌套量詞,這會減慢正則表達式的執行速度並引起其他問題 。 您需要使其更加線性。
@(\w+(?:[-.]\w+)*)?(:\d+)(:\w+)
請參閱正則表達式演示
正則表達式將匹配
@
- @
符號 (\\w+(?:[-.]\\w+)*)?
-可選的組匹配
\\w+
- 1+單詞字符 (?:[-.]\\w+)*
-
或(?:[-.]\\w+)*
0+序列.
( [-.]
)后跟1個以上的字符字符 (:\\d+)
-a :
后跟1個數字的符號 (:\\w+)
-a :
符號后跟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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.