0

有効な文字列 がありsomestr xyztipxyzはオプションです。ただし、xyz存在する場合は、 tip(空白なし) の隣にある必要があります。したがって、有効な文字列は次のとおりsomestr tipですsomestr xyztip

無効な文字列は次のようになります: (とsomestr xyz tip の間のスペース)xyztip

多くの組み合わせを試しましたが、正規表現が「xyz」と「tip」の間のスペースでボークすることはできません。以下のものは、私がうまくいくと思うものです:

/^.+?\s(xyz)?tip$/

問題は、'(xyz)?' の前の構文です。- それは '.+?\s' です。これは任意の char を 1 回以上言っており、貪欲の後に 1 つの空白が続いているわけではありません。

ここで何が欠けていますか?

4

3 に答える 3

1

xyzの直前を除いて、文字列内のどこにもそれを配置できないと仮定するとtip、次のように動作するはずです。

/^((?!xyz).)+\s(xyz)?tip$/

これにより、 が に変わり.+?ます((?!xyz).)+。繰り返しグループ内に否定先読みを配置することで、任意の数の文字に一致させることができますが、遭遇すると停止するxyzため((?!xyz).)+、「fooxz」の「foo」に一致します。これによりxyz、 が正規表現の最初の部分と決して一致しないことを確認できるため、存在する場合は(xyz)?tip正規表現の部分に含まれる必要があります。

于 2013-11-11T17:15:24.453 に答える
0

必要なのは「ゼロ幅の正の先読みアサーション」です...したがって、正規表現は次のようになります。

\S+\s(?:xyz)?(?=tip)

正規表現の視覚化

からperldoc perlre:

"(?=pattern)"
    A zero-width positive look-ahead assertion.  For example, "/\w+(?=\t)/"
    matches a word followed by a tab, without including the tab in $&.
于 2013-11-11T17:13:13.780 に答える