簡體   English   中英

perl正則表達式匹配重復單詞

[英]perl Regular expression matching repeating words

一個正則表達式,它與具有相同單詞連續連續重復兩次或更多次的輸入行匹配。 假設連續單詞之間有一個空格

if($line!~m/(\b(\w+)\b\s){2,}/{print"No match\n";}
    {   print "$`";       #print out first part of string
        print "<$&>";     #highlight the matching part
        print "$'";       #print out the rest
    }

到目前為止,這是我最好的選擇,但是如果我做錯了,那我就有些錯誤了

\\b以單詞邊界開頭

(\\w+)后接一個或多個單詞

\\b以單詞邊界結尾

\\s然后是空格

{2,}檢查這件事是否重復2次或更多次

我的表情怎么了

這應該是您要尋找的內容: (?:\\b(\\w+)\\b) (?:\\1(?: |$))+

另外,在查找空格時請勿使用\\s因為您可能會匹配換行符或其他空白字符。 簡單的空格不是正則表達式中的定界符或特殊字符,因此只需鍵入空格即可。 如果您希望它在視覺上更加明顯,可以使用[ ]

我在regexr.com上嘗試了CAustin的回答,但結果卻出乎我的意料。 同樣,不需要所有非捕獲組。

我的正則表達式:

(\b(\w+))( \2)+

單詞邊界,后跟(1個或多個單詞字符)[組2],然后是以下一項或多項:空格,組2。

接下來的一個用\\s+替換空格,將單詞之間的分隔概括為1或多個任何一種空白:

(\b(\w+))(\s+\2)+

您實際上並沒有在檢查是否重復相同的單詞。 為此,您需要使用捕獲的反向引用:

if ($line =~ m/\b(\w+)(?:\s\1){2,}\b/) {
     print "matched '$1'\n";
}

此外,無論何時測試正則表達式,如果您創建要使用的示例列表,都會很有幫助。 下面演示了使用__DATA__塊的一種方法

use strict;
use warnings;

while (my $line = <DATA>) {
    if ($line =~ m/\b(\w+)(?:\s\1){2,}/) {
        print "matched '$1'\n";
    } else {
        print "no match\n";
    }
}

__DATA__
foo foo
foo bar foo
foo foo foo

輸出

no match
no match
matched 'foo'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM