1

文字列の操作に正規表現のみを使用できる環境で作業しており、最初から特定のキーワードがその文字列に表示されるまで文字列を消費する必要があります。ただし、そのキーワードがまったく表示されない場合があります。正規表現ではこれを考慮する必要があります。つまり、キーワードの表示はオプションであり、表示されない場合は、文字列全体を最後まで消費したいと思います。

キーワードはdontconsumeafterthisです

キーワードの例:

これは、キーワードdontconsumeafterthisを含む文字列です。この部分は消費しないでください。

必要な出力:

これはキーワードを含む文字列です

キーワードなしの例:

これは、キーワードなどがない別の文字列です。pp。

必要な出力:

これは、キーワードなどがない別の文字列です。pp。

4

3 に答える 3

2

次の正規表現はそれを解決するはずです(Expressoで私のために働きます):

(.*?)(?=dontconsumeafterthis)|(.*)

説明:2つのオプションがあります。最初のオプションが一致しない場合、最後のオプションは文字列全体を取得しますが、最初のオプションは、ヒットdontconsumeafterthisした場合にのみ一致し、演算子を使用してキャプチャから除外します。また、 (遅延評価)?=に注意してください。*?、これは、の複数の出現をdontconsumeafterthis考慮に入れます)。

于 2012-12-13T13:37:56.237 に答える
1

の正規表現は/.*?(dontconsumeafterthis.*)/gあなたのために働くはずです。

javascriptのソリューションは次のようになります。

var stringStart = "this is a string continaing the keyword dontconsumeafterthis this part should not be consumed";
var stringEnd = stringStart.replace(/.*?(dontconsumeafterthis.*)/g, "$1");
console.log(stringEnd);

そしてそれは出力します:

dontconsumeafterthis this part should not be consumed

注意

Johny SkovdalがOPのコメントに書いたように、なぜ正規表現でこれを行う必要があるのですか?単純な文字列検索を実行し、代わりに一致が見つかった場合は部分文字列を実行できますか?

そのJavascriptソリューション:

var stringStart = "this is a string continaing the keyword dontconsumeafterthis this part should not be consumed";
var stringFind = stringStart.indexOf("dontconsumeafterthis");
var stringEnd = (stringFind > -1 ? stringStart.substr(stringFind) : "");
console.log(stringEnd);
​

(以前と同じ出力)

于 2012-12-13T10:09:46.197 に答える
0

言語/環境によって異なりますが、一般的な考え方は、キーワードとその後のすべてを一致させて何も置き換えないことです。キーワードが一致しない場合は、何も置き換えられません。s/keyword.*//

$ cat file
this is a string continaing the keyword dontconsumeafterthis this part should not be consumed

this is another string without the keyword whatever etc. pp.6    

$ sed 's/dontconsumeafterthis.*//' file
this is a string continaing the keyword 

this is another string without the keyword whatever etc. pp.6  
于 2012-12-13T10:16:27.840 に答える