私は本当に正規表現を学ぼうとしているので、ここに行きます。
どちらの側にも「/」がない文字列内のすべての単語を取得したいと思います。たとえば、次のようにする必要があります。 "Hello Great / World /"結果を取得する必要があります: "Hello" "Great"
これは正規表現で可能ですか?もしそうなら、どうすればよいですか?結果を文字列配列に格納したいと思います:)
ありがとうございました
この正規表現を使用するだけ\b(?<!/)\w+(?!/)\b
です:
var str = "Hello Great /World/ /I/ am great too";
var words = Regex.Matches(str, @"\b(?<!/)\w+(?!/)\b")
.Cast<Match>()
.Select(m=>m.Value)
.ToArray();
これはあなたを得るでしょう:
Hello
Great
am
great
too
var newstr = Regex.Replace("Hello Great /World/", @"/(\w+?)/", "");
本当に文字列の配列が必要な場合
var words = Regex.Matches(newstr, @"\w+")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
最初に文字列を配列に分割し、次に一致する単語を除外します。このソリューションは、「単語」とフィルターの要件をより適切に見つけることができるため、大きな正規表現よりもクリーンな場合があります。
大きな正規表現の解決策は、単語の境界のようなものになります-スラッシュではありません-多くの空白なし-スラッシュではありません-単語の境界。
正規表現置換を使用して、すべての/ [a-zA-Z] /を''(なし)に置き換えてから、すべての単語を取得します
これを試してください:(デモについてはここをクリックしてください)
(\s(?<!/)([A-Za-z]+)(?!/))|((?<!/)([A-Za-z]+)(?!/)\s)
この例の抜粋を使用して:
/ character / "_"(アンダースコア/アンダーストライク)は/ used / in / variable / names / in / many / programming / / languages /にすることができますが、/ character / "/"(スラッシュ/ストローク/ソリドゥス)通常は許可されていません。
...この式は、文字、数字、アンダースコア、またはアポストロフィ(英語の「単語」のかなり一般的な概念)の前後に/
文字がない文字列に一致します-wrapped with a "/"
\b([\w']+)\b(?<=(?<!/)\1|\1(?!/))
...そしてこれは最も純粋な形式であり、「単語」文字を定義するために1つの文字クラスのみを使用します。次のように例と一致します。
Matched Not Matched
------------- -------------
The character
_ used
underscore variable
under in
strike programming
can languages
be character
in stroke
names
many
while
the
slash
solidus
is
typically
not
allowed
を除外する/stroke/
必要がない場合は、「次の」単語の先頭をどのように定義するかに応じて、末尾の制限にビットを追加すると許可されます。
\b([\w']+)\b(?<=(?<!/)\1|\1(?!/([^\w]))).
に変更(?!/)
し(?!/([^\w]))
ます。これにより、直後に文字、数字、またはアンダースコア/something/
が含まれる場合に使用できます。これはstroke
、上記の「一致しない」リストから「一致する」リストに移動します。
注:\w
大文字または小文字、数字、および下線文字に一致します
[\w']
上記の「単語」の概念を変更する場合は、式の一部に含まれる文字と省略文字クラス[a-zA-Z']
を、数字を除外したり[\w'-]
、ハイフンを含めたりするunder-strike
だけで、単一の一致としてキャプチャされます。 2つの別々の一致より:
\b([\w'-]+)\b(?<=(?<!/)\1|\1(?!/([^\w])))
重要な代替案!!! (おもう)
記号で囲まれていない単語を一致させる代わりの方法を考えました。これらの記号とそれらに囲まれている単語をすべて消費する(分割する)だけです。これにはいくつかの利点があります。ルックアラウンドがないということは、効率を高めながら、より多くのコンテキストで使用できることを意味します(JavaScriptはルックビハインドをサポートせず、正規表現の一部のフレーバーはルックアラウンドをまったくサポートしません)。また、分割式を使用することは、文字列配列の直接の結果を意味します。/
string input = "The /character/ "_" (underscore/under-strike) can be..."; //etc...
string[] resultsArray = Regex.Split(input, @"([^\w'-]+?(/[\w]+/)?)+");
出来上がり!