2

Henry spencer 正規表現ライブラリを参照して、 と の違いを知りたい(.+_)*です(.)*

(.+_)*後ろからの文字列も一致させようとします。私の理解.では、任意の 1 文字に一致.+するということは、その文字のゼロ以外の出現を意味します。_スペースまたは { または } または などを意味します。

括弧は、いずれかが一致すると見なされることを*意味し、最後の括弧は 0 回以上の出現を意味します。

(.)*も同じことを達成すると思います。+後は.冗長かもしれません。

誰かが私に2つの微妙な違いを説明できますか?

4

3 に答える 3

2

たとえば、後者はスペースの前に 1 文字のみを想定しているため、によってaa aaは一致しますが、によっては一致し(.+_)*ません。(._)*

于 2012-12-18T10:32:05.300 に答える
2

アンダースコアに特別な意味があることを思い出しません。Henry Spencer 正規表現ライブラリの特別な点は、正規表現エンジンの手法 (決定論的および非決定論的) を組み合わせていることです。

これには長所と短所があります。

長所は、正規表現が可能な限り高速で、単純に構築されることですが、他のエンジンでは、同じ速度を達成するために、頭を見て高度な正規表現手法 (一致しない場合は早期に失敗させるなど) を使用する場合があります。

短所は、正規表現全体が貪欲または非貪欲のいずれかになることです。つまり、次の ? なしで * または + を使用すると、? を使用しても正規表現全体が貪欲になります。その後。最初に * または + を使用し、その後に ? を続けると、正規表現全体が非貪欲になります。

これにより、正規表現を作成するのが少し難しくなりますが、実際にはわずかです。

Henry Speced ライブラリはtclregexpコマンドの背後にあるエンジンであり、これによりこの言語は正規表現に対して非常に効率的になります。

于 2012-12-18T10:32:56.877 に答える
1

_特別な意味はないので、ただの「_」です。regular-expressions.infoを参照してください

2つの正規表現は同じではありません。

  1. (._)*1文字の後にアンダースコアが続く場合(実装でアンダースコアに特別な意味がある場合は、「アンダースコア」をその意味に置き換えます)、このシーケンスは0回以上一致します(例:「a_%_._?_

  2. (.+_)*少なくとも1つの文字とそれに続くアンダースコアに一致します。このシーケンスは、0回以上一致します。例: " abc45_%_.;,:_?#'+*~_"

(.+_)*一致する可能性のあるすべてのものに一致します(._)*が、その逆はありません。

于 2012-12-18T11:13:15.363 に答える