У меня есть строка для разбора. Сначала мне нужно проверить, содержит ли строка специальный шаблон:
У меня есть небольшое регулярное выражение для него в С#
string input = "$(abc)";
string pattern = @"\$\(([^$][^\s]*)\)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(input);
foreach (var match in matches)
{
Console.WriteLine("value = " + match);
}
Он работает во многих случаях, но с ошибкой на входе = $ (a $(), который внутри выражения пуст. Я не хотел, чтобы НЕ совпало, когда входной файл равен $(). [Между начальным и конечным идентификаторами нет ничего].
Что не так с моим регулярным выражением?
Текущее текущее регулярное выражение не соответствует $()
потому что [^$]
соответствует не менее 1 символу. Единственный способ, которым я могу думать о том, где вы бы имели этот матч, будет, когда у вас есть вход, содержащий более одного парса, например:
$()(something)
В этих случаях вам также необходимо будет исключить хотя бы заключительный параграф:
string pattern = @"\$\(([^$\s)]+)\)";
Вышеприведенные совпадения, например:
abc
в $(abc)
иabc
и def
в $(def)$()$(abc)(something)
. Примечание: [^$]
соответствует одному символу, но не $
Используйте следующее регулярное выражение, если вы хотите сопоставить $()
\$\(([^\s$]*)\)
Используйте следующее регулярное выражение, если вы не хотите сопоставлять $()
,
\$\(([^\s$]+)\)
*
повторяет предыдущий токен ноль или более раз.+
Повторяет предыдущий токен один или несколько раз. Ваше регулярное выражение \(([^$][^\s]*)\)
неверно. Он не допустит $
как первый символ внутри ()
но он допускает его как второй или третий, и т.д. См. Демонстрацию здесь. Вам нужно совместить отрицаемые классы в вашем регулярном выражении, чтобы соответствовать любому символу не пробела или $
.
Просто замените * на + и объедините параметры.
string pattern = @"\$\(([^$\s]+)\)";
+ означает 1 или более
* означает 0 или более
string input = "$()";
или ты что-то еще после этого ставил?