【问题标题】:Regex to match a hyphenated and non hyphenated word simultaneously正则表达式同时匹配连字符和非连字符的单词
【发布时间】:2016-06-09 22:39:01
【问题描述】:

您好,我有以下字符串:

e-bgp-ip@2016-03-21.y:688: error: bad value "redi-bfg" (should be if-feat-ex)

我需要用正则表达式匹配字符串。但是,字符串可以是连字符的,也可以是非连字符的,所以它也可以是

e-bgp-ip@2016-03-21.y:688: error: bad value "redibfg" (should be if-feat-ex)

我可以用

捕捉非连字符版本
/^.*? error: bad value \"\w+\" \(should be *.*$/m

我正在尝试替换此正则表达式匹配的任何行,这是我为不同行提供的示例:

$line = preg_replace('/^.*? key \"\w+\" not in order, *.*$/m', '', $line);

但是我需要一个可以同时捕获第一个示例和第二个示例的正则表达式,有人知道我该怎么做吗?

【问题讨论】:

  • 使用\S+(非空格)代替\w+(单词)。

标签: php regex


【解决方案1】:

只需将\w 替换为包含破折号的字符类:[\w-]

$line = preg_replace('/^.*? key "[\w-]+" not in order, *.*$/m', '', $line);

【讨论】:

  • 我建议将- 直接放在左方括号之后,以避免无意中创建字符范围。
  • @syck:你是说应该像托托那样把它放在最后吗?
  • 要按原样解释连字符,您必须将其放在开头或结尾;如果它位于字符之间,则将其解释为范围运算符(如在[a-z] 中)。假设有时您还必须允许一些其他字符,例如 @ 或 + 或其他任何字符。 [$-,] 将构成一个有效的字符范围(与[$%&'()*+,] 相同),但可能不是您想要的。所以我通常建议养成将连字符放在课程开头的习惯。只需我的两美分即可避免难以找到的错误。
猜你喜欢
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
相关资源
最近更新 更多