Regex 如果连字符位于两个数字之间,则正则表达式匹配所有数字和连字符
如果连字符被文本包围,我希望删除所有文本和连字符,如果连字符在数字范围内,则保留连字符。如果我使用像^0-9^-它将保留所有连字符,即使它在一个范围内。我想不出正确的语法Regex 如果连字符位于两个数字之间,则正则表达式匹配所有数字和连字符,regex,Regex,如果连字符被文本包围,我希望删除所有文本和连字符,如果连字符在数字范围内,则保留连字符。如果我使用像^0-9^-它将保留所有连字符,即使它在一个范围内。我想不出正确的语法 Example string: 80 http, 135 epmap, 139 netbios-ssn, 443 https, 445 microsoft-ds, 1433 ms-sql-server, 3389, 5985, 8530, 10123, 49000-49999, 50000-59999, 60000-65535
Example string: 80 http, 135 epmap, 139 netbios-ssn, 443 https, 445 microsoft-ds, 1433 ms-sql-server, 3389, 5985, 8530, 10123, 49000-49999, 50000-59999, 60000-65535, 61003, 62959
试试这个正则表达式:
Outcome string example : 80, 135, 139, 443, 445, 1433, 3389, 5985, 8530, 10123, 49000-49999, 50000-59999, 60000-65535, 61003, 62959,
说明:
匹配尽可能多的数字\d+
我们可以选择匹配一个-?
-
此部分仅与连字符后的其余数字匹配。如果没有连字符,则开头的\d*
会匹配每个数字\d+
下面的正则表达式将帮助您解决问题
\d+-?\d*
爆炸性说明:
- \d+匹配一个数字(等于[0-9]) +量词-在一次和无限次之间匹配,尽可能多地匹配,根据需要回馈(贪婪) -? 匹配字符-按字面意思(区分大小写) ?量词-匹配0到1次,尽可能多地匹配,根据需要回馈(贪婪) \d*匹配一个数字(等于[0-9]) *量词-在零次和无限次之间匹配,尽可能多地匹配,根据需要返回(贪婪) 全局模式标志 g修饰语:全局。所有比赛(第一场比赛后不返回) m修改器:多行。使^和$匹配每行的开始/结束(不仅仅是字符串的开始/结束)
[\S\S]*?(\d+(?:-\d+)[^\d]*
更换
$1,
可读版本
\d+-?\d*
在结果字符串中,还希望删除不带连字符的单词 要获得结果字符串,此模式可能对您有所帮助
[\S\s]*?
( # (1 start)
\d+
(?: - \d+ )*
) # (1 end)
[^\d]*
^0-9^-
是一个错误的模式,您将无法获得任何匹配。您尝试的实际模式是什么?您使用的是什么正则表达式工具/语言?
?[a-z-]+(?!\d)