Regex 正在尝试在分隔符之间匹配字符

Regex 正在尝试在分隔符之间匹配字符,regex,Regex,分隔符为-(在破折号前后加空格) 正文是:信息和电信-工资和工资-非管理。我试图匹配的文本是信息和电信,工资和工资,以及非管理 我找到的最接近的正则表达式是(\s-\s)?[\w\s]+(\s-\s)?,但不幸的是,匹配会产生非和管理作为单独的匹配 另一个例子是:信息和电信-工资和工资-非管理-1--2实际上,您需要一个正则表达式,它匹配单词字符,或紧靠-或行尾的空格或连字符 下面的正则表达式应该可以 (\w(?:[\w\s]|\w-\w)*)(?=(?:\s-\s)|$) 解释 (

分隔符为
-
(在破折号前后加空格) 正文是:
信息和电信-工资和工资-非管理
。我试图匹配的文本是
信息和电信
工资和工资
,以及
非管理

我找到的最接近的正则表达式是
(\s-\s)?[\w\s]+(\s-\s)?
,但不幸的是,匹配会产生
管理
作为单独的匹配


另一个例子是:
信息和电信-工资和工资-非管理-1--2

实际上,您需要一个正则表达式,它匹配单词字符,或紧靠
-
或行尾的空格或连字符

下面的正则表达式应该可以

(\w(?:[\w\s]|\w-\w)*)(?=(?:\s-\s)|$)
解释

(             # matching group start
  \w          # match any word character once
    (?:       # start of a non-matching group
      [\w\s]  # match any word character or space character
      |       # OR
      \w-\w   # match any hyphen that's in between two word characters
    )*        # find this non-matching group zero or multiple times
)             # matching group end
(?=           # lookahead start
  (?:\s-\s)   # non-matching group for space hyphen space
  |           # OR
  $           # end of string
)             # lookahead end

事实上,您需要一个正则表达式,它匹配单词字符,或紧靠
-
或行尾的空格或连字符

下面的正则表达式应该可以

(\w(?:[\w\s]|\w-\w)*)(?=(?:\s-\s)|$)
解释

(             # matching group start
  \w          # match any word character once
    (?:       # start of a non-matching group
      [\w\s]  # match any word character or space character
      |       # OR
      \w-\w   # match any hyphen that's in between two word characters
    )*        # find this non-matching group zero or multiple times
)             # matching group end
(?=           # lookahead start
  (?:\s-\s)   # non-matching group for space hyphen space
  |           # OR
  $           # end of string
)             # lookahead end

您可以将空格与可选连字符
-
匹配,也可以将连字符与可选空格
-
匹配,但不能与
-
匹配

\w+(?:(?: -*|-+ ?)\w+)*
模式匹配

  • \w+
    匹配1个以上的单词字符
  • (?:
    非捕获组
    • (?:-*|-+?)
      匹配
      和0+
      -
      或匹配1+次
      -
      和可选
    • \w+
      匹配1个以上的单词字符
  • )*
    关闭非捕获组并可选地重复

您可以将空格与可选连字符
-
匹配,也可以将连字符与可选空格
-
匹配,但不能与
-
匹配

\w+(?:(?: -*|-+ ?)\w+)*
模式匹配

  • \w+
    匹配1个以上的单词字符
  • (?:
    非捕获组
    • (?:-*|-+?)
      匹配
      和0+
      -
      或匹配1+次
      -
      和可选
    • \w+
      匹配1个以上的单词字符
  • )*
    关闭非捕获组并可选地重复

用“-”分隔字符串不是更好吗?@JohnyL,拆分函数对于单字符分隔符可能很容易,但对于像“-”这样的模式(破折号前后都有空格)就不容易了。用“-”分隔字符串不是更好吗?@JohnyL,拆分函数对于单字符分隔符可能很容易,但对于诸如“-”之类的模式(在破折号之前和之后都有空格)就不容易了。尽管我喜欢您粘贴的第一个正则表达式的简单性。使用以下示例数据进行测试时:
信息和电信-工资和工资-非管理-1--2
,生成1和2作为单独的匹配项。@Vivek例如,您可以重复-like
\w+(?:(?:-*|-+)\w+*
查看您刚才提供的解决方案。如果您想编辑您的答案以粘贴此新答案,请点击它。通过查看最内部的非捕获组:
(?:-*|-+?)
我观察到空间不能用“\s”速记交替表示。尽管我喜欢您粘贴的第一个正则表达式的简单性。使用以下示例数据进行测试时:
信息和电信-工资和工资-非管理-1--2
,生成1和2作为单独的匹配项。@Vivek例如,您可以重复-like
\w+(?:(?:-*|-+)\w+*
查看您刚才提供的解决方案。如果您想编辑您的答案以粘贴此新答案,请点击它。通过查看最内部的非捕获组:
(?:-*|-+?)
我观察到空间不能用“\s”速记交替表示。当使用以下示例数据进行测试时:
信息和电信-工资和工资-非管理-1--2
,生成1和2作为单独的匹配项。当使用以下示例数据进行测试时:
信息和电信-工资和工资-非管理-1--2
,生成1和2作为单独的匹配项。