49

可変長の後読みアサーションをサポートする Python/PHP/JavaScript の正規表現の実装はありますか?

/(?<!foo.*)bar/

同じ意味を持つが、後読みアサーションを使用しない正規表現を作成するにはどうすればよいですか?

このタイプのアサーションがいつか実装される可能性はありますか?

物事は私が思っていたよりもはるかに優れています。

アップデート:

(1) 可変長の後読みアサーションをサポートする正規表現の実装が既にあります。

Python モジュールregex (標準reではなく、追加のregexモジュール) は、このようなアサーションをサポートしています (そして、他にも多くのクールな機能があります)。

>>> import regex
>>> m = regex.search('(?<!foo.*)bar', 'f00bar')
>>> print m.group()
bar
>>> m = regex.search('(?<!foo.*)bar', 'foobar')
>>> print m
None

Perl にはできず、Python にはできることが正規表現にあるということは、私にとって本当に大きな驚きでした。おそらく、Perl にも「強化された正規表現」の実装がありますか?

(おかげでMRABに+1)。

\K(2)現代の正規表現にはクールな機能があります。

この記号は、置換を行う場合 (そして、私の見解では、アサーションの最も興味深い使用例は置換です)、以前に見つかったすべての文字を\K変更してはならないことを意味します。

s/unchanged-part\Kchanged-part/new-part/x

これはほとんど後読みアサーションのようなものですが、もちろんそれほど柔軟ではありません。

についての詳細\K:

私が理解している限り、同じ正規表現で \K を 2 回使用することはできません。そして、見つけたキャラクターをどの時点まで「殺す」かを言うことはできません. それは常に行頭までです。

(池上に感謝と+1)。

追加の質問:

  • どの点が最終的​​な効果の点でなければならないかを言うことは可能\Kですか?
  • Perl/Ruby/JavaScript/PHP の強化された正規表現の実装についてはどうですか? regexPythonのようなもの。
4

5 に答える 5

48

ほとんどの場合、 を使用すると、可変長の後読みを回避できます\K

s/(?<=foo.*)bar/moo/s;

だろう

s/foo.*\Kbar/moo/s;

最後\Kに遭遇したものまでは、一致の一部とは見なされません (たとえば、置換の目的$&など)。

否定後読みは少しトリッキーです。

s/(?<!foo.*)bar/moo/s;

だろう

s/^(?:(?!foo).)*\Kbar/moo/s;

なぜなら(?:(?!STRING).)*そのまままで. STRING_[^CHAR]*CHAR


単に一致している場合は、\K.

/foo.*bar/s

/^(?:(?!foo).)*bar/s
于 2012-07-24T22:57:50.290 に答える
13

Python には、可変長の後読みをサポートする正規表現の実装があります。

http://pypi.python.org/pypi/regex

標準の re モジュールと下位互換性があるように設計されています。

于 2012-07-25T00:21:31.403 に答える
5

文字列とパターンを逆にして、可変長の先読みを使用できます

(rab(?!\w*oof)\w*)

太字で一致:

raboof rab7790oof raboo rabof rab rabo raboooof rabo

私が知る限り、元のソリューションは次のとおりです。

Jeff 'japhy' Pinyan

于 2012-07-24T23:44:47.763 に答える
2

表示する正規表現は、が前に付いてbarないインスタンスを見つけますfoo

簡単な代替方法は、最初fooに文字列と照合し、最初に出現したインデックスを見つけることです。次に を検索し、そのインデックスの前にbarあるオカレンスが見つかるかどうかを確認します。

の直前barがないインスタンスを見つけたい場合は、(後読みを使用せずに) そのための正規表現を提供することもできますが、非常に見苦しくなります。基本的に、 --の意味を逆にします。foo/foo//[^f]oo|[^o]o|[^o]|$/

于 2012-07-24T23:03:26.417 に答える