不确定我是否理解正则表达式:(\ b \ w +)\ 1 \ b?

时间:2014-10-10 03:54:58

标签: regex linux grep

我得到它在更高级别上做的...它检测到重复的单词。我无法理解的是这是如何运作的逻辑。如果我的理解消失,我希望你能纠正我。其他细节假设我在Linux机器上使用grep。

  1. \ b将检测第一个字符。
  2. \ w +会扫描这些字母。
  3. 现在对于我感到困惑的部分。

    1. 括号将"存储"字母到第一个空格或第二个\ b
    2. 然后/ 1将重复步骤1到3然后进行比较,如果它们匹配...显示。
    3. 如果可能,我会很感激外行人的条款。

3 个答案:

答案 0 :(得分:3)

(\b\w+) \1\b检测到重复的。例如,abc abcaaa aaax123_ x123_

单词是单词字符的序列,定义如下。

单词字符,取决于模式(ASCII,Locale或Unicode)将匹配字母表(可以是区域设置),数字(可以是区域设置)和下划线。

\b检测字边界,这是您可以在之前或之后(但不是两者)找到字符的位置。

上面的正则表达式存在轻微缺陷。如果该单词重复3次或更多次,则在替换为捕获组1时,将仅删除重复单词的一半。

答案 1 :(得分:1)

模式说明:

  (                        group and capture to \1:
    \b                       the word boundary
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or more times)
  )                        end of \1
                           ' '
  \1                       what was matched by capture \1
  \b                       the word boundary

如果您使用\w来捕获a-z,A-Z,0-9,_因此您不需要指定用于字边界的第一个\b

\1是由第一组匹配的后向引用。

此处括号(...)用于制作组。

                  (\b\w+) \1\b
First Group ------^^^^^^   ^-------- Match First Group again

Online demo

答案 2 :(得分:0)

\ 1是反向引用,这意味着它与最后一个捕获组匹配。 在这种情况下,\ b \ w是捕获组,因此\ 1匹配最后捕获的组。

有关反向引用的更多信息,请点击此处 http://www.regular-expressions.info/backref.html