Одно регулярное выражение для соответствия частей в разных позициях - PullRequest
2 голосов
/ 23 апреля 2010

Я пытаюсь проанализировать DSN (из приложения Symfony), используя регулярные выражения, для связи со вторичным приложением, но с использованием той же базы данных.

DSN, который у меня сейчас есть:

mysql:dbname=my_db_name;host=localhost

с регулярным выражением:

/^(\w+):(dbname=(\w+))?;?(host=(\w+))?/

(используя preg_match()). Это соответствует ОК, но в моей тестовой среде происходит сбой, потому что элементы DSN переключаются, таким образом:

mysql:host=localhost;dbname=my_testdb_name

Я мог бы просто переключить их, да :-) но я уверен, что извлечение частей host и dbname из обоих DSN возможно с помощью одного регулярного выражения, и я хотел бы иметь возможность расширить свои знания в то же время ;-) Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Следующее выражение может соответствовать двум DSN

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/

Но оно может соответствовать mysql: host = localhost; host = localhost тоже ...

1 голос
/ 23 апреля 2010

Я бы разбил строку на ';'затем используйте отдельные регулярные выражения для каждой интересующей меня части в каждой части разделенной строки.

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

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

, чтобы вы могли сделать это

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/

, которое можно уменьшить до:

    /^(\w+):((dbname|host)=(\w+));?+

вам может потребоваться настроить свой вкус регулярного выражения, я привык только к .net

...