Regex, чтобы найти специальный шаблон

1

У меня есть строка для разбора. Сначала мне нужно проверить, содержит ли строка специальный шаблон:

  1. Я хотел знать, есть ли подстроки, которые начинаются с "$ (", и заканчиваются на ")",
  2. и между этими начальными и конечными специальными строками не должно быть пустое пространство,
  3. он не должен включать в себя символ "$".

У меня есть небольшое регулярное выражение для него в С#

 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
    Вы использовали только string input = "$()"; или ты что-то еще после этого ставил?
  • 0
    извините, неудачный ввод = $ (a $ () где между $ (AND) и $, что противоречит моим правилам
Показать ещё 4 комментария
Теги:

3 ответа

2
Лучший ответ

Текущее текущее регулярное выражение не соответствует $() потому что [^$] соответствует не менее 1 символу. Единственный способ, которым я могу думать о том, где вы бы имели этот матч, будет, когда у вас есть вход, содержащий более одного парса, например:

$()(something)

В этих случаях вам также необходимо будет исключить хотя бы заключительный параграф:

string pattern = @"\$\(([^$\s)]+)\)";

Вышеприведенные совпадения, например:

  • abc в $(abc) и
  • abc и def в $(def)$()$(abc)(something).
3

Примечание: [^$] соответствует одному символу, но не $

Используйте следующее регулярное выражение, если вы хотите сопоставить $()

\$\(([^\s$]*)\)

Используйте следующее регулярное выражение, если вы не хотите сопоставлять $(),

\$\(([^\s$]+)\)
  • * повторяет предыдущий токен ноль или более раз.
  • + Повторяет предыдущий токен один или несколько раз.

Ваше регулярное выражение \(([^$][^\s]*)\) неверно. Он не допустит $ как первый символ внутри () но он допускает его как второй или третий, и т.д. См. Демонстрацию здесь. Вам нужно совместить отрицаемые классы в вашем регулярном выражении, чтобы соответствовать любому символу не пробела или $.

1

Просто замените * на + и объедините параметры.

string pattern = @"\$\(([^$\s]+)\)";

+ означает 1 или более

* означает 0 или более

Ещё вопросы

Сообщество Overcoder
Наверх
Меню