このルールを使用してステートメントを見つけるための正規表現ステートメントを手伝ってくれる人はいますか?
単語には、「J、U、G」の文字 (順序ではなく文字のみ) と、G、L、E、R、S の少なくとも 1 つの文字が含まれている必要があります。
そのため、ジャグ、ジャグラー、ジャグラー、ジャグルなどのリストを検索できます。
ありがとう
正規表現ソリューションもあります。ただし、@Quick Joe Smith が書いたように、タスクには他にもっと良い解決策がある可能性があるため、使用している言語を実際に指定する必要があります。
^(?=.*J)(?=.*U)(?=.*G)(?=.*[LERS]).*$
Rubularを参照してください
これら(?=)
は肯定的な先読みで、文字列に文字があるかどうかをチェックしますが、それらは一致しません。最後の.*
は、完全な文字列と一致します。
i
また、ignorecase (大文字と小文字を区別しない) をオンにする修飾子も必要です。
質問の最初の部分は、正規表現にはまったく適していません。パターンは複雑な混乱を招き、必要な文字を追加するほど悪化します。
ただし、2 番目の部分は簡単です。
m/[glers]/i
したがって、ソリューションを 2 つの部分に分けて実装することをお勧めします。これは言語によって異なります。
var chars = "GJU"; // characters are sorted.
if (inputstring.ToUpper().Intersect(chars).OrderBy(c => c).SequenceEqual(chars)) {
// do stuff if match.
}
my @chars = sort split '', 'GJU'; # Transform into sorted array.
my %input = map{($_, 1)} split '', uc $inputstring; # stores unique chars from string.
if (@chars ~~ %input) { # Smart match performs hash key intersection.
# Do stuff in here.
}
chars = set('jug')
input = set(inputstring)
if chars == (chars & input):
# do something here
一度に 1 つの単語で作業している場合は、次のことを試してください。
boolean isMatch = s.matches(
"(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4");
より長い文字列で一致を検索する場合:
Pattern p = Pattern.compile(
"(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4");
Matcher m = p.matcher(s);
while (m.find()) {
String foundString = m.group();
}
最初の 4 つの選択肢 ( J()
、U()
、G()
または[GLERS]()
- ) のいずれかが何かに一致するたびに、それに続く空のグループは何も「キャプチャ」しません (つまり、空の文字列)。文字列の最後に到達すると、各後方参照\1
( 、\2
など) は、対応するグループが一致したものと一致しようとします。
明らかに、それは常に成功します。あなたはいつでも一致することができます。トリックは、対応するグループが一致に参加していない場合、後方参照は一致しようとさえしないということです。つまりj
、ターゲット文字列にno がない場合()
、J()
代替の the は関与しません。正規表現エンジンが\1
後方参照を後で処理すると、グループが一致に参加していないことがわかっているため、すぐに失敗が報告されます。
このように、空のグループはチェック ボックスのように機能し、後方参照はすべてのボックスがチェックされていることを確認します。ただし、しわが 1 つあります。との両方が一致する可能性がG()
あります。必要なときに、2 人が確実に試合に参加するようにするにはどうすればよいですか? 私が試した最初の正規表現、[GLERS]()
g
"(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"
G()
...代替が両方を消費していたため、単語「jugg」と一致しませんでしたg
。[GLERS]()
一度も参加する機会がありませんでした。だから私は否定的な先読みを追加しました(?!.*G)
- そして今、それは最後の g
. に一致する可能性のある選択肢が 3 つある場合、最初の選択肢と 2 番目の選択肢g
に追加する必要があります。しかし、現実的には、その点に到達するかなり前に、おそらく別のアプローチ (おそらく正規表現を使用しないアプローチ) に切り替えていたでしょう。;)(?!.*G.*G)
(?!.*G)