Regex со всеми дополнительными частями, но по крайней мере одна требуется - PullRequest
1 голос
/ 10 мая 2010

Мне нужно написать регулярное выражение, которое соответствует строкам, таким как "abc", "ab", "ac", "bc", "a", "b", "c". Порядок важен, и он не должен соответствовать нескольким появлениям одной и той же детали.

а? Б? С? почти делает трюк. За исключением того, что совпадает с пустыми строками тоже. Есть ли способ предотвратить совпадение пустых строк или другой способ написать регулярное выражение для задачи.

Ответы [ 4 ]

6 голосов
/ 10 мая 2010
^(?=.)a?b?c?$

Это проверит, есть ли хотя бы один персонаж с предвкушением, и будет соответствовать вашему регулярному выражению.

2 голосов
/ 10 мая 2010

Чтобы сделать это с помощью регулярных выражений, вам нужно расширить его на все его возможности:

ab?c?|a?bc?|a?b?c

Если у вас есть предпросмотры, вы можете убедиться, что строка не пустая. Или вы можете проверить, что строка имеет длину по крайней мере один, прежде чем передавать ее в выражение, в зависимости от выбранного вами языка.

Например, .NET прогноз может выглядеть так:

^(?=[abc])a?b?c?$

Или вы можете просто проверить длину строки, прежде чем сопоставить ее:

if (YourString.Length == 1) {
   // matching code goes here, using the expression a?b?c?
}
0 голосов
/ 10 мая 2010

Бессмысленно пытаться объединить все функциональные возможности всех ваших проблем в одно регулярное выражение. Лучшее решение - написать очевидное регулярное выражение и добавить проверку на нулевую длину. Вы должны быть очень умны с регулярными выражениями, когда вам абсолютно необходимо - например, если вам нужно взаимодействовать с неизменяемым API, который принимает только одно регулярное выражение и ничего более.

0 голосов
/ 10 мая 2010

Вы можете записать все перестановки (что является болью) или все возможности, которые не пропущены буквы (ab?c?|a?bc?|a?b?c), что несколько меньше боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...