1

私が直面している小さな問題。多くの単語が含まれる長い文字列があり、それを分割しようとしていますが、文字列のほとんどの部分には開始と終了があり、それを参照する静的ですが、これには終了しかありません。取得しようとしている文字列の実際のビットは動的ですが、最大 16 文字であり、それより少ない可能性があり、フレーズ内の単語の量は不明です。

例:

Name: John Smith Occupation: Doctor Currently Busy Gender: Male 

前に他の文字列の終わりを取得せずに、「現在ビジー」を単独で取得したい。

しかし、同じコードを使用して、この文字列から「まだここにはありません」を取得したいと考えています。

Name: John Smith Occupation: Doctor Not Yet Here Gender: Male 

方法が見つからず、それが可能かどうかさえわからないので、ここの誰かが助けてくれることを願っています.

4

2 に答える 2

1

あなたの問題は、RegEx では解決できない可能性がある問題です。「職業」の値が 1 つまたは複数の単語である可能性があり、1 つまたは複数の単語である可能性のある別の値が直接続く場合、人間として 2 つのフレーズをどのように区別しますか?

少なくとも、一連の既知のOccupation値があることを願っています。その場合は、次のように式を作成できます。

(?<=Doctor |Nurse ).*(?= Gender)

(?<=...)andビットは後(?=...)読みおよび先読みアサーションであり、本質的に「Doctor |Nurse一致したフレーズの前に式が表示されることを確認し(ただし、その部分には一致しない)、式Genderが一致したフレーズの後に表示されることを確認します(ただし、その部分にも一致しません)」それの)」

実際にこれを参照してください: http://regexr.com?34buq

于 2013-04-02T00:27:47.393 に答える
0

最もエレガントな方法ではありませんが、解決策は次のとおりです。

$string = 'Name: John Smith Occupation: Doctor Currently Busy Gender: Male';
$groups = array_filter(preg_split('/\s?\w+:\s?/', $string));
// Split by [\s? => optional space][\w+ => characters a-zA-Z0-9_][:][\s? => optional space]

// $groups[2] contains 'Doctor Currently Busy'
$pieces = explode(' ', $groups[2]);
$pieces = array_reverse($pieces);
$length = 0;$i = 0;$c = count($pieces);$result = array(); // We need this for the loop
// $c and $i are to preserve the first word if the length of all words are < 16 !

foreach($pieces as $piece){
    $length += strlen($piece);
    $i++;
    if($length <= 16 && $c != $i){
        $result[] = $piece;
    }else{
        break;
    }
}

$result = array_reverse($result);
$final_result = implode(' ', $result);
echo $final_result; // Currently Busy
于 2013-04-02T08:36:30.540 に答える