0

任意の量のスペースで始まり、その後に文字が続く連続した行を一致させようとしています|sフラグを使用しているため、.改行に一致します。

私がこれまでに持っていたものは、前に限られた量の空白で機能し|ます。

要件を満たさないラインに達したと判断する部分に問題があります。何らかの理由\n\s*[^\|]でトリックを行いません。私が今していることは次のとおりです。

(?P<terminating>
    \n(             # when newline is encountered...
        [^\|\s]         #   check if next character is not: (| or space)
        |
        [\s][^\|\s]     #   check if next characters are not: space + (| or space)
        |
        [\s][\s][^\|\s] #   check if next characters are not: space + space + (| or space)... And so on....
    )
    |
    $
)

これは明らかに 2 つのスペースでのみ機能します。これを任意の量のスペースで機能させたいと思います。私は再帰を調べましたが、この場合、それは非常に重い銃のようです。これが私の質問です:なぜうまくいか\n\s*[^\|]ないのですか?再帰なしでこれを解決する別の方法はありますか?


以下は、取得したい入力と結果の一致の例です。

入力文字列:

Lorem ipsum dolor sit amet, 
consectetur adipisicing 
elit, 
|sed do 
        |eiusmod tempor incididunt 
     |ut labore et dolore magna aliqua.
Ut enim ad minim veniam, 
quis nostrud exercitation 
ullamco laboris nisi ut 
aliquip ex ea commodo consequat.

出力は、コンテンツを含む 1 つの文字列です。

|sed do\n        |eiusmod tempor incididunt\n     |ut labore et dolore magna aliqua.

その中にある各行と3回一致することは望ましくありません|

4

4 に答える 4

1

s 修飾子なしでこのパターンを試すことができます。

(?:(?:^|(?<=\n))[^\S\r\n]*\|.*(?:\r?\n|$)?)+
于 2014-03-06T22:09:52.463 に答える
0

私はそれを自分で解決しました。除外している文字グループからスペースを除外する必要があると思います:

n\s*[^\|\s]

これがなぜなのかよくわかりませんが、まったくの偶然でこれに出くわしました。誰かがこの背後にある理由を説明できれば幸いです。

完全な式は次のようになります。

'/
    (?:
        (^|\n)\s*\|
    )
    (?P<main>
        .*?
    )
    (?=
        \n\s*[^\|\s]
        |
        $
    )
/sx'
于 2014-03-06T23:20:33.680 に答える
0

perl を使用している場合は、以下のコードを使用できます。私はそれがより良いことができると確信しています。誰かがコードを強化するのを手伝ってくれるかどうかを知りたいです

my $Str = "Lorem ipsum dolor sit amet,
consectetur adipisicing
elit,
|sed do
        |eiusmod tempor incididunt
     |ut labore et dolore magna aliqua.
Ut enim ad minim veniam,
quis nostrud exercitation
ullamco laboris nisi ut
aliquip ex ea commodo consequat.";
@lLine = split('\n', $Str);
foreach $lLine (@lLine) {
    if($lLine =~ /^[\s\|]+.*$/) {
        $ReturnStr .= $lLine;
    }
}

出力は次のとおりです。

于 2014-03-26T10:53:11.660 に答える