【问题标题】:Escaping char in regex在正则表达式中转义字符
【发布时间】:2020-10-29 20:11:51
【问题描述】:

我在我的 bash 终端中运行了这个示例:

echo "ab" | egrep '\a\b'

输出

ab

然后我运行了这个:

echo "a" | egrep '\a\b'

输出

a

我很困惑。为什么我得到输出? 但后来我又输入了一个:

echo "a" | egrep '\ab'

并没有得到输出。

扩展正则表达式的 \a\b 和 \ab 有什么区别?

附言

Regex 没有忽略第一个字母:

echo "b" | egrep '\a\b'

输出为空 正则表达式的行为符合我的预期,但与第一种情况有什么不同?

P.P.S 我发现这个例子:

echo 'ab' | egrep '\a\b'

也不输出任何东西。在第一种情况下(echo "ab" | egrep '\a\b'),输出是 ab。引号如何影响正则表达式?

【问题讨论】:

  • 在 grep (GNU grep) 3.1 中,echo "ab" | egrep '\a\b' 不返回任何结果。
  • \b 很特别,\a 只是写a 的更复杂的方式。
  • 基本上\b 就像$ 你的例子。
  • 好的,我意识到转义字母是不安全的。但是其他角色呢?他们逃跑的时候除了自己还有其他意义吗?还是只有具有相似属性的字母?

标签: regex linux grep


【解决方案1】:

'\a\b' 生成 \a\b 正则表达式,其中 \a 是未知转义序列并匹配 a\b 是单词边界。

echo "a" | egrep '\a\b' - 正确输出a,有一个a 后面没有数字、字母或下划线。

echo "a" | egrep '\ab' - 正确不输出任何东西,a 不包含ab

echo "b" | egrep '\a\b' - 正确不输出任何东西,b 不包含a

至于echo "ab" | egrep '\a\b',应该不输出任何结果,ab在字边界处不包含aa后面有b

其他在转义时表示其他含义的字母(GNU grep,POSIX):

  • \B - 不是单词边界位置的位置
  • \s - 空格
  • \S - 非空格
  • \w - 字母、数字和下划线
  • \W - 不同于字母、数字和下划线的字符。

此外,还有\<(单词开头)和\>(单词结尾)。

如果您使用-P,PCRE 模式,还有更多可用的转义序列(请参阅pcresyntaxpcrepattern)。

【讨论】:

  • 好的,我意识到转义字母是不安全的。但是其他角色呢?他们逃跑的时候除了自己还有其他意义吗?还是只有具有相似属性的字母?
  • 或者,无后果的转义仅适用于特殊字符,例如:^、$ 等。如果是这样,是否有某种所有此类符号的列表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2010-12-22
  • 2010-09-21
  • 2020-07-24
相关资源
最近更新 更多