正则表达式查找带有条件的子字符串

时间:2019-12-04 17:07:46

标签: java regex string

我尝试编写regexp来查找字符串中带减号的数字。

  1. 此数字的开头或结尾都有一个减号(-)。
  2. 此子字符串可以以空格开头或/和结尾,也可以以字符串开头或结尾。
  3. 另一个字符串可以包含此子字符串,但不能有空格,并且此字符串需要排除

正则表达式应与这些字符串匹配

abc ghhkjl -123
123- gfdhs kljf
fdsg -123 fdjol
jklp 123- ljfds
-123
123-

正则表达式不应与这些字符串匹配

abc ghhkjl-123
123-gfdhs kljf
fdsg -123fdjol
jklp123- ljfds

我做过的正则表达式

(?:^|\W|\w+\s)\d+(?:$|\W|\s\w+)

请帮助!

2 个答案:

答案 0 :(得分:3)

听起来像您可以使用lookarounds强制被空格,开始或结尾包围。

(?<!\S)(?:\d+-|-\d+)(?!\S)

See this demo at regex101

上方的\S与一个字符匹配,该字符不是空格(\s的取反)。

答案 1 :(得分:2)

或者,如果要查找单个数字,则可以在该数字的左侧和右侧重复匹配的单词字符和水平空格字符,该字符的左侧或右侧带有减号:

^(?:\h*\w+\h+)*(\d+-|-\d+)(?:\h+\w+\h*)*$
  • ^字符串的开头
  • (?:非捕获组
    • \h*在开头匹配可选的水平空白字符
    • \w+\h+匹配1个以上的字符字符,然后匹配1个以上的水平whitspace字符
  • )*关闭组并重复0次以上
  • (\d+-|-\d+)捕获第1组,带负号的数字
  • (?:非捕获组
    • \h+\w+匹配1个以上水平的whitspace字符和1个以上的单词字符
    • \h*在末尾匹配可选的水平whitspace字符
  • )*关闭组并重复0次以上
  • $字符串结尾

Regex demo