正規表現を使用して文字列内の一致を検索したいと思います。私が探しているパターンを見つける方法は他にもありますが、正規表現ソリューションに興味があります。
これらの文字列を検討してください
"ABC123"
"ABC245"
"ABC435"
"ABC Oh say can You see"
検索結果「ABC」の後にANYTHINGBUT「123」を続けて一致させたい。正しい正規表現は何ですか?
次のテストコードを試してください。これはあなたが必要とすることをするはずです
string s1 = "ABC123";
string s2 = "we ABC123 weew";
string s3 = "ABC435";
string s4 = "Can ABC Oh say can You see";
List<string> list = new List<string>() { s1, s2, s3, s4 };
Regex regex = new Regex(@".*(?<=.*ABC(?!.*123.*)).*");
Match m = null;
foreach (string s in list)
{
m = regex.Match(s);
if (m != null)
Console.WriteLine(m.ToString());
}
出力は次のとおりです。
ABC435
Can ABC Oh say can You see
これは、「ネガティブルックアヘッド」と「ポジティブルックビハインド」の両方を使用します。
これがお役に立てば幸いです。
ネガティブ先読みの使用:
/ABC(?!123)/
次の文字列に一致するものがあるかどうかを確認できますstr
。
Regex.IsMatch(str, "ABC(?!123)")
完全な例:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] strings = {
"ABC123",
"ABC245",
"ABC435",
"ABC Oh say can You see"
};
string pattern = "ABC(?!123)";
foreach (string str in strings)
{
Console.WriteLine(
"\"{0}\" {1} match.",
str, Regex.IsMatch(str, pattern) ? "does" : "does not"
);
}
}
}
残念ながら、上記の正規表現は、その後に。ABC
が続かない限り一致し123
ます。それ以降に少なくとも1文字一致する必要がある場合ABC
(つまり、文字列自体/末尾で123
一致しない場合)は、を使用できます。ドットは、 :demoの後に少なくとも1文字一致することを保証します。ABC
ABC(?!123).
ABC
ただし、最初の正規表現はあなたが探しているものだと思います(「何もない」が「何でも」と見なされる限り:P
)。
正規表現の代わりに、これが使いやすいと感じた場合。提案のみ。
List<string> strs = new List<string>() { "ABC123",
"ABC245",
"ABC435",
"NOTABC",
"ABC Oh say can You see"
};
for (int i = 0; i < strs.Count; i++)
{
//Set the current string variable
string str = strs[i];
//Get the index of "ABC"
int index = str.IndexOf("ABC");
//Do you want to remove if ABC doesn't exist?
if (index == -1)
continue;
//Set the index to be the next character from ABC
index += 3;
//If the index is within the length with 3 extra characters (123)
if (index <= str.Length && (index + 3) <= str.Length)
if (str.Substring(index, 3) == "123")
strs.RemoveAt(i);
}