Простое регулярное выражение для сопоставления до необязательного символа? - PullRequest
3 голосов
/ 15 августа 2011

Я уверен, что это простой вопрос для тех, кто легко справляется с регулярными выражениями:

Мне нужно сопоставить все до символа #

Я не хочу, чтобы следующая строкасимвол #, только материал перед ним и сам символ не должны совпадать.Это самая важная часть, и то, что я в основном спрашиваю.В качестве второго вопроса я также хотел бы знать, как сопоставить остальное, после символа #.Но не в том же выражении, потому что оно мне понадобится в другом контексте.

Вот пример строки:

themes / install.xml # id_install

Я хочу только темы/install.xml.И для второго вопроса (отдельное выражение) я хочу id_install

Ответы [ 6 ]

3 голосов
/ 15 августа 2011

Первое выражение:

^([^#]*)

Второе выражение:

#(.*)$
0 голосов
/ 05 февраля 2013

Для чего-то подобного в C # я обычно вообще пропускаю материал с регулярными выражениями и делаю что-то вроде:

string[] split = exampleString.Split('#');
string firstString = split[0];
string secondString = split[1];
0 голосов
/ 15 августа 2011

первый: /[^\#]*(?=\#)/ редактировать : быстрее, чем /.*?(?=\#)/

второй: /(?<=\#).*/

0 голосов
/ 15 августа 2011

Используйте взгляд вперед и посмотрите назад:

  • Чтобы получить все символы до, но не включая фунт (#): .*?(?=\#)
  • Чтобы получить все следующие символы, кроме фунта (#): (?<=\#).*

Если вы не возражаете против использования групп, вы можете сделать все это за один раз:

  • (.*?)\#(.*) Ваши ответы будут в группе (1) и группе (2). Обратите внимание на не жадную конструкцию *?, которая будет пытаться сопоставить как можно меньше, а не как можно больше.
  • Если вы хотите разрешить пропустить раздел #, используйте ([^\#]*)(?:\#(.*))?. Он использует не собирающую группу для проверки второй половины и, если найдет ее, возвращает все после фунта.

Честно говоря, для вашей ситуации, вероятно, проще использовать метод Split, представленный в String.

Подробнее о взглядах вперед и назад

0 голосов
/ 15 августа 2011
[a-zA-Z0-9]*[\#]

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

0 голосов
/ 15 августа 2011

Я не использую C #, но я предполагаю, что он использует pcre ... если так,

"([^#]*)#.*"

с призывом к «совпадению». Вызов 'search' не нуждается в конце ". *"

Парены определяют «группу поддержки»; [^ #] означает любой символ, который не является '#'

Вы, наверное, пробовали что-то вроде

"(.*)#.*"

и обнаружил, что он терпит неудачу, когда присутствует несколько знаков «#» (сохраняя ведущие «#»)? Это потому, что ". *" Является жадным, и будет соответствовать столько, сколько может.

У вашего сопоставителя должен быть метод, похожий на 'group (...)'. Большинство совпадений вернуть всю подобранную последовательность как группу (0), первую подобранную группу как группу (1), и пр.

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

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