4

文字列の一部を削除する必要がある状況があり、これには正規表現を使用できると考えました。

テストケースは次のようなものです

LINDA L
LINDSAY GRIFFIN
LINDSAY LIGHTHOUSE
LINDSAY PETERSON

そして、最初の末尾または2 番目と 3 番目L\bの先頭を削除したいので、次のようになります。L.*?\b

LINDA
GRIFFIN
LIGHTHOUSE
PETERSON

L\b|L.*?\b1行目と3行目全体(スペースを除く)を削除しますが、これは私が望むものではありません。これを1つの式で行う方法はありますか? 最初の正規表現が一致したため、2番目の正規表現には移動しないと思いました。

皆さんありがとうございます。1 つの複雑な正規表現ではなく、CF 条件と 2 つの置換を使用することになりました。

4

4 に答える 4

3

私はこれがあなたがやりたいことを達成すると思います:

(\bL$)|((?!.*\bL$)^L.*?\b)

説明すると(\bL$)、最初のパターンに一致します。単語の境界、次にL、次に行末です。

((?!.*\bL$)^L.*?\b)行の先頭のLに一致し、その後に単語の残りの部分が続きます(.*?\bあなたが持っていたように、単語の終わりに到達するための合理的なパターンです)。これ(?!.*\bL$)はネガティブな先読みであり、次のパターンが一致した場合に一致を防ぎ?!ます。この場合、patterm\bL$が行のどこかに表示されると、一致が妨げられます。

それはとにかく私が思いついたものです。確かに醜いです。質問で示唆したように、これを実行するためのはるかに優れた方法は、2つの別個の正規表現パターンを使用し、最初のパターンが行に一致するものを見つけられなかった場合にのみ2番目のパターンを実行することです。

于 2013-01-07T21:31:21.670 に答える
1

@femtoRgonはほとんどそれを手に入れましたが、いくつかの空白がぶら下がっています。完全な CF ソリューションは次のようになります。

result = reReplace(string, "(\s*\bL$)|((?!.*\bL$)^L.*?\b\s*)", "", "ONE");

string「LINDA L」や「LINDSAY GRIFFIN」などはどこにあるでしょう。

これは、指定したすべての例をテストしますが、指定したルールについてはかなり文字通りです。

于 2013-01-07T21:39:51.977 に答える
1

注:これは、単一の文字列があり、関連する場合は両方のアクションを適用することを前提としています (つまり、2 番目のアクションは最初のアクションに依存していません)。それがあなたが望むものではない場合は、質問を明確にする必要があります。


1つの正規表現でそれを行うと、物事が不必要に醜くなります(したがって、保守性が低下します).2つでそれを行う方法は次のとおりです。

Input.replaceFirst('\s+L(?=\n)','').replaceAll('(?<=\n)L\w+\s+','')

最初の式は、最初の行から L (および前の空白) を削除します (replaceFirst を使用しているため、最初の行のみ)。

2 番目の式は、行の先頭にあるすべての L ワードを削除します (先頭に改行がない最初の行を除く)。

(どちらの場合も常に\s+一致するため、\bここで明示的に指定する必要はありません。ただし、空白を削除したくない場合は、代わりに使用できます。)


CFML rereplace 関数を使用する場合は、次のようになります。

rereplace( rereplace(Input,'\s+L(?=\n)','') , '(\n)L\w+\s+' , '\1' , 'all' )

個人的には、他の方法の方が読みやすいと思います。

于 2013-01-08T00:10:12.660 に答える
0

条件付き正規表現を確認する必要があります。

http://www.regular-expressions.info/conditional.html

于 2013-01-07T21:21:27.053 に答える