正则表达式匹配所有数字和连字符,如果连字符在数字之间

时间:2018-06-02 10:56:48

标签: regex

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

如果连字符被文本包围,我想删除所有文本和连字符,如果连字符在数字范围内,请保留连字符。如果我使用^ 0-9 ^ - 它将保留所有连字符,即使它在一个范围内。我无法弄清楚正确的语法。

Outcome string example : 80, 135, 139, 443, 445, 1433, 3389, 5985, 8530, 10123, 49000-49999, 50000-59999, 60000-65535, 61003, 62959,

4 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

\d+-?\d*

说明:

  • \d+匹配尽可能多的数字
  • -?我们可选择匹配-
  • \d*此部分仅匹配连字符后面的其余数字。如果没有连字符,则开头的\d+将匹配每个数字

Demo

答案 1 :(得分:0)

正则表达式将帮助您解决问题。

\d+-?\d*

爆炸说明:

  • \ d +匹配一个数字(等于[0-9])

    + Quantifier - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)     - ?匹配字符 - 字面意思(区分大小写)

    <强>?量词 - 尽可能多次匹配0到1次,根据需要回馈(贪婪)    \ d *匹配一个数字(等于[0-9])

    *量词 - 在零和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)    全局模式标志    g修饰符:全局。所有比赛(首场比赛后不返回)    m修饰符:多行。导致^和$匹配每行的开头/结尾(不仅是字符串的开头/结尾)

答案 2 :(得分:0)

这有效:

查找[\S\s]*?(\d+(?:-\d+)*)[^\d]*
替换$1,

https://regex101.com/r/ar2HoB/1

可读版本

 [\S\s]*?  
 (                             # (1 start)
      \d+ 
      (?: - \d+ )*
 )                             # (1 end)
 [^\d]* 

答案 3 :(得分:0)

在结果字符串中,您还希望删除没有连字符的单词。

要获得结果字符串,这种模式对你有帮助。

 ?[a-z-]+(?!\d)