1

引用符で囲まれていない文字列 (ダブルまたはシングル) に一致する正規表現を作成しようとしていますが、これまでにできる最善の方法は、文字列のすべての文字を反復処理するループです。よりシンプルでエレガントなソリューションが必要です。

例:文字列に置き換えようとするfooとになりますが、文字列は同じままです。barhello foo!hello bar!you said "my name is foo"

上記を達成するために正規表現を手伝ってくれる人はいますか?

4

3 に答える 3

0

これも行う必要があったので、自分で解決しました...この解決策はバランスの取れた引用符に依存していませんが、アポストロフィがペアになっている場合は明らかにサポートされません。

#!/usr/bin/perl

my @test = ( 'hello foo!',
             '"my name is foo"',
             'foo test "test foo test" test foo test "test foo test" test foo',
             "foo test 'test foo test' test foo test 'test foo test' test foo",
             '"foo test foo"',
             'foo test " foo test' );

foreach ( @test )
{
  s!("[^"]*"|'[^']*')|foo!$1//'bar'!ge;
  print "$_\n";
}
于 2015-03-10T00:33:11.123 に答える
0

更新:クイックサマリー:これを実際に処理するには「グループの分散」が必要ですが、短い答えは、単一引用符も必要な場合はできないということです。それらはアポストロフィを兼ねているからです。したがって、何があっても、これは本当にあなたThat's when foo said, "That's my line!"を台無しにするでしょう。カスタム解析エンジンを構築する必要があります。

注:これがHTMLプロパティの場合...私はあなたが言うようにそれらを適切に解析する正規表現を書きました.Perlで動作すると思います. =しかし、それは記号やその他の HTML 構造などの区切り記号にも依存しています。しかし、これらのケースの 90% では、XML/HTML パーサーが最適なオプションです (その 10% はまだ可能性があります)。

あなたの質問へのコメントで述べたように、より多くの例がより具体的な答えを与えてくれます。これはあなたの限られた例に対する答えです:

^([^"']*?)foo([^"']*)$

ルックアラウンドは、中級の正規表現ライターにとっては簡単ですが、コードのメンテナンスは複雑であり、通常は必要なものではありません。また、正規表現でドットを使用する必要があるもの.は、通常、可能な限り効率的ではありません。

私の例を次のように置き換えると$1bar$2、あなたは金色になります。しかし、繰り返しますが、私のコメントが言うように、これは文字列全体が引用符で始まり引用符で終わると仮定する基本的な例に基づいています。異なる例があれば、それらが役立ちます。

添加

楽しみのために、他の 2 つのオプションについてあなたの質問に答えます。オプション1は、上記の私の最初の答えです。

オプション 2 (フロリスが述べたように):

Hi foo, I said "hello"

または

"hello", said foo to his friend.

この場合、引用テキストが検索テキスト (この場合は foo) の前または後にのみ表示される場合、答えは次のようになります。

^(?:([^"']*?)foo(.*)|(.*?)foo([^"']*))$

オプション3(以下の私のコメントに見られるように)

He said, "Hello", so then Foo told him, "Lawl, bye"

これを行うには、foo の前後の引用符の数を数えて、それらが偶数であること、または .NET 正規表現で「バランス」と呼ばれる「閉じる」ことを確認する必要がありますが、どちらのオプションも使用できません。あなたの状況では、他のカスタム関数はありません。

于 2013-10-05T04:24:14.423 に答える