1

文字列に正規表現を適用し、最初の一致を返すコードを使用しています。すべての一致を返すようにコードを変更するためのアクセス権がありません。また、代替コードを実装することもできません。

次のターゲット文字列の例があります。

usera、userb ,, userc ,, userd、usere、userf、

これは、複数のソースから結合されたコンマ区切りのユーザー名のリストです。一部は空白で、場所によっては2つのコンマが表示されます。特定の値を除いて、コンマで区切られたすべてのユーザー名を返す正規表現を作成しようとしています。

たとえば、次の式について考えてみます。

[^,]\w{1,},(?<!(userb|userc|userd),)

これにより、次の3つの一致が発生します。

ウセラ、

usere、

userf、

これらの結果を、一致コレクションではなく、単一の一致として取得する方法はありますか?たとえば、テキスト「usera、usere、userf」を持つ単一の一致はありますか?

任意の言語でコードを記述できれば、これは簡単ですが、入力はターゲット文字列とパターンのみに制限されており、省略しているものを除くすべての項目を含む単一の一致が必要です。これが可能かどうかはわかりませんが、正規表現でこれまでに行ったことはすべて、一致コレクション内の複数のアイテムを処理することです。

これがRegexCoachの例です。この画像は、必要な3つの一致があることを示していますが、私の要件は、3つの別々の一致ではなく、1つの一致にテキストを含めることです。

ここに画像の説明を入力してください

編集1: このチケットを明確にすることは、正規表現構文のみを使用してユースケースを解決することを特に目的としています。コードでこの問題を解決するのは簡単ですが、実行中のコードがリバースエンジニアリング、ラップ、または置換したくないサードパーティ製品の一部であるという事実を考えると、正規表現のみを使用して解決することが要件でした。

4

1 に答える 1

2

一致コレクションではなく、単一の一致としてこれらの結果を取得する方法はありますか?たとえば、テキストを持つ単一の一致'usera,usere,userf,'?

いいえ。正規表現の一致は連続しています。

正規表現は、最初から最後まで (部分) 文字列に一致します。中間部分を削除することはできません。これは正規表現エンジンの仕組みではありません。ただし、式を再度適用して、一致する別の部分文字列を見つけることができます (インクリメンタル検索 - これが Regex Coach の機能です)。これにより、一致コレクションが生成されます。


そうは言っても、保持したくないものすべてに一致させて削除することもできます。

,(?=[\s,]+)|(userb|userc|userd)[\s,]*

http://rubular.com/r/LOKOg6IeBa

于 2013-01-22T21:11:16.743 に答える