S | \ B-d \ b ||正则表达式没有按预期工作

时间:2018-02-23 21:19:55

标签: regex perl

以下一个班轮不能正常工作,我期待:

echo "--tags hi -d -e foo=bar" | perl -ne '$_ =~ s|\b-d\b||; print $_'

" -d"遗迹。看了15分钟后,我觉得我应该得到帮助。

这确实有效:

echo "--tags hi -d -e foo=bar" | perl -ne '$_ =~ s|-d||; print $_'

但当然可能并不总是有效...即我在搜索中需要单词边界标记。

2 个答案:

答案 0 :(得分:6)

\b并不意味着在空格之前或之后,它意味着一个单词边界(一个单词字符序列的转换);由于-不是单词字符,\b-表示-必须在其前面加上单词字符。

我猜你的意思可能是s|(?<!\S)-d(?!\S)||-d既不在前面也不在后面跟着非空白字符。

See the code in use here

答案 1 :(得分:2)

d不同,-不是单词char,因此请使用(?<!\w)代替\b

\b

装置

# At a word char that's not preceded by a word char, or
# after a word char that's not followed by a word char.
(?<!\w)(?=\w) | (?<=\w)(?!\w)

所以

\b -d \b

装置

(?: (?<!\w)(?=\w)|(?<=\w)(?!\w) ) -d (?: (?<!\w)(?=\w)|(?<=\w)(?!\w) )

由于-不是单词char,而且d是单词char,因此上述内容简化为:

(?<=\w) -d (?!\w)

如果-是单词char,则上述内容将简化为以下内容:

(?<!\w) -d (?!\w)

这就是你想要的,或者只是

(?<!\w) -d \b

(为了便于阅读,添加了空格。删除空格或使用/x