s |\b-d\b | | regex未按预期工作

s |\b-d\b | | regex未按预期工作,regex,perl,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 $_' 但当然可能并不总是有效的。。。i、 我需要在搜索中使用单词边界标记 \b并不意味着前面或后面有空格,它意味着一个单词边界,

下面的一个班轮没有像我预期的那样工作:

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 $_'
但当然可能并不总是有效的。。。i、 我需要在搜索中使用单词边界标记

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

我猜你是说s |-d前面和后面都没有非空白字符

与d不同,-不是char一词,所以使用?而不是\b

意味着

意味着

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

(?<!\w) -d (?!\w)
这就是你想要的,或者只是

(?<!\w) -d \b

为可读性增加了空格。要么删除空格,要么使用/x.

在空格和-之间没有单词边界,在d之前。试试-d\b还是?这就是我想要捕捉的东西:echo-tags a-b-c-d-d-e foo=bar | perl-ne'$|=~s | \b-d\b |;打印$你完全正确。破折号不属于“\w”。一开始我没看到,这是正确的答案。我已经删除了我的答案,因为它可能会失败-如果您愿意,您可以为工作代码演示添加此链接:@senor:ASCII单词字符是非常简单的任何字母数字字符,加上笨拙的下划线。我能猜到设计师们在想什么,但对我来说,这和readdir也回来一样令人沮丧。还有..,这些都没有用。还值得指出的是\b将在字符串开头的单词字符之前或结尾的单词字符之后匹配a。也就是说,它不需要前面或后面的非单词字符来输入。@ysth:它的意思是。。。文字字符和非文字字符之间的转换我经常遇到这种误解,但正如我在上面所写的,它的意思是?不是?
\b -d \b
(?: (?<!\w)(?=\w)|(?<=\w)(?!\w) ) -d (?: (?<!\w)(?=\w)|(?<=\w)(?!\w) )
(?<=\w) -d (?!\w)
(?<!\w) -d (?!\w)
(?<!\w) -d \b