0

ひもで

Test=Hello World #Some more text
Test=Hello World

「Test」グループと「Hello World」グループの両方をキャプチャする必要があります。文字列が「#」で始まる場合、まったくキャプチャされません。

以下の式は、それぞれ 1 番目と 2 番目の文字列に対して機能します。

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])
^((?!#).+)(?:=)(.+[\S])

キャプチャしない 2 つの正規表現グループ間でビット単位の論理 OR を実行するにはどうすればよいですか?

私は何かをやってみました

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*)

しかし、それを正しく機能させることはできません。

詳細

背景: これは C# (.NET Framework 4.0) で行われています。ファイルは 1 行ずつ読み取られています。等化記号の左側のテキストは変数名を参照し、等化記号の右側のテキストは変数の値を参照します。このファイルは構成ファイルとして使用されています。

一般的なケース:

注: すべての末尾の空白 - 最後の非空白文字の末尾の後の空白はキャプチャされません。これには、2 番目のグループの末尾とポンド記号の間のスペースも含まれます。

1) 空白を除くすべての文字の直後に等化記号が続き、その後に任意の文字セットが続き、その後にスペースとポンド記号が続きます。例えば

this=is valid #text
s0_is=this #text
and=th.is #text
the=characters after the    # Pound sign are irrelevant

2) ケース 1 とまったく同じ状況ですが、2 番目のキャプチャ グループとポンド記号の間に末尾のスペースがありません。例えば

this=is valid#text
s0_is=this#text
and=th.is#text
the=characters after the# Pound sign are irrelevant

3) ケース 1 および 2 と同じ状況。ただし、# 記号がまったくない場合 (末尾の空白については上記の注を参照してください)。例えば

this=is valid
s0_is=this
and=th.is
the=characters after the

これら 3 つのケースすべてで、キャプチャ グループはそれぞれ次のようになります (| 記号は、キャプチャ グループを区別するために使用されます)。

this|is valid
s0_is|this
and|th.is
the|characters after the

特殊なケース:

1) 行の最初の文字は # 記号です。これにより、何もキャプチャされません。

2) # 記号は = 記号の直後にあります。これにより、2 番目のキャプチャ グループが null になるはずです。

3) # 記号は、上記で明示的に述べられていない他の場所で使用されます。これにより、何もキャプチャされません。

4) 新しい行の最初の文字の前に空白があってはなりません。ただし、このケースが実際に発生する可能性は低いです。

5) イコライズ記号の直後のスペースは無効です。

無効なケース (何もキャプチャしない場合):

th is=is not valid#text
nor =this#text
 or_this=something
also= this
4

2 に答える 2

2

これを必要以上に難しくしているのではないかと思います。この正規表現を試してください:

^(\w+)=([^\s#]+(?:[ \t]+[^\s#]+)+)

もちろん、入力が実際に複数行であると仮定して、改行と一致して次の行に波及する[ \t]+のを防ぐ代わりに使用しました。\s+必要に応じて、スタンドアロンの文字列に適用することもできます。

編集:あなたのコメントに答えて、この正規表現を試してください:

^(\w+)=(\w+(?:[ \t]+\w+)*)

最初の正規表現では、限定的な仮定を避けるようにしていましたが、少し夢中になりました。ご覧のとおり、すべての単語に使用できれば\w+、はるかに簡単になります。

于 2012-08-14T19:38:35.837 に答える
1
^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*)

一致を意味します

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])

また

(?:.*)

これを試して

^((?!#).+)(?:=)(.+[\S])(?:(?:[\s]*[#])|(?:.*))

ちょっと無意味に思えますが(?:.*)、代わりに次のようなことを試してみませんか:

^((?!#).+)(?:=)(.+?\S)(?:\s*[#])?

これは、オプションで最後のグループに一致します。これは、あなたがやろうとしていると私が思うことであり、この場合はより良いオプションです。

于 2012-08-14T16:05:00.393 に答える