Regex 如果连字符位于两个数字之间,则正则表达式匹配所有数字和连字符

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

如果连字符被文本包围,我希望删除所有文本和连字符,如果连字符在数字范围内,则保留连字符。如果我使用像^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, 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)