2

たとえば、次のような文字列があります。

first:second:third"test:test":fourth

「:」以降を数えて、「:」ごとに分割して文字列を取得したい。

これは私の正規表現です:

/(.*):(.*)/iU

これが最善の解決策かどうかはわかりませんが、うまくいきます。「。」の間に違いがあります。と「[...] : [...]」なので、それらを分離する必要があります。私の正規表現は : をカウントしますが、 : が ".

私はこの正規表現でこれを解決しようとしました:

/(((.*)[^"]):((.*)[^"]))/iU

これが正しい方法だと思いましたが、そうではありません。正規表現の構文を学ぼうとしましたが、この問題がわかりません。

この正規表現は単に次のことを意味します:「:」を検索します - すべての考えが情報になる可能性があり、その後に " が前にあり、" が後にある場合を除きます。

多分あなたは私を助けることができます。

編集:PHPで正規表現を使用しています-これは重要な情報かもしれません

4

3 に答える 3

4

使ってみてはどうですか

$result = preg_split(
    '/:       # Match a colon
    (?=       # only if followed by
     (?:      # the following group:
      [^"]*"  #  Any number of characters except ", followed by one "
      [^"]*"  #  twice in a row (to ensure even number of "s)
     )*       # (repeated zero or more times)
     [^"]*    # followed by any number of non-quotes until...
     $        # the end of the string.
    )         # End of lookahead assertion
    /x', 
    $subject);

それはあなたに結果を与えるでしょう

first
second
third"test:test"
fourth

直接?

:この正規表現は、その後に偶数の引用符が続く場合にのみa で分割されます。:これは、文字列内で分割されないことを意味します。

于 2012-08-15T16:13:45.770 に答える
2

この正規表現はそれを行う必要があります。ニーズに一致し、追加の説明が必要な場合は、質問してください:)

(?<=:|^)(?<!"[^:][^"]+:)\w+?(?=:|"|$)

それは私が使用したテスト文字列です

"test1:test2:test3":first:second:third "test1:test2:test3":fourth:fifth "test1:test2:test3":sixth

そして、これらは次の6つの一致です。

first
second
third
fourth
fifth
sixth
于 2012-08-15T19:27:29.530 に答える
0

テキストの解析が大好きです。だから私はあなたのためにパーサーを書きます。

$sample = 'first:second:third"test:test":fourth';
$len = strlen($sample);
$c =0;
$buffer="";
$output = array();
$instr = false;
for($i =0; $i< $len; $i++){
    if($sample[$i]=='"' or $sample[$i]=="'"){
        $c++;
        $instr= $c%2==0 ? false: true;
        $buffer.=$sample[$i];
    }elseif(!$instr and $sample[$i]==':'){
        $output[]=$buffer;
        $buffer = "";
    }else{
        $buffer.=$sample[$i];
    }
}
if($buffer) $output[] = $buffer;

print_r($output);

実際のコードをご覧ください。また、巨大な文字列の正規表現のパフォーマンスが低下することにも注意してください。

于 2012-08-15T16:22:12.097 に答える