Проблема регулярного выражения - PullRequest
2 голосов
/ 06 июня 2010

У меня есть пример

Term:a=27 B=90 C=65

.... и я хочу только значение C и A, C первое и A второе

у меня есть

(C=(\d+)^|A=(\d+))

но безуспешно

почему

пожалуйста

Ответы [ 3 ]

1 голос
/ 06 июня 2010

В вашем регулярном выражении вы используете символ ^, это указывает на начало строки, поэтому "c = (\ d +) ^" никогда не сделает совпадение, если оно не пытается сопоставить что-то, что находится перед началом строки?

Насколько я знаю, регулярное выражение не может вести себя так, как вы хотите (как в одной строке, возвращающей два значения, последнее перед первым), это довольно легко сделать с двумя отдельными выражениями, а затем просто используйте последний (C) перед первым (a) как в псевдокоде

match_for_a = "a=(\d+)"
match_for_c = "C=(\d+)"
do_something( match_for_c)
do_something( match_for_a)

У вас уже есть (почти почти) соответствующее регулярное выражение для каждого

a=(\d+)

и

C=(\d+)

EDIT: на основе вашего комментария и моего ответа приведем псевдокод для функции, возвращающей кортеж.

tuple match_c_and_a(){
  match_for_a = regex_match("a=(\d+)")
  match_for_c = regex_match("C=(\d+)")
  return (match_for_c, match_for_a)
}

Но такие вещи не являются регулярным выражением и зависят от языка программирования.

ИЗМЕНИТЬ СНОВА Извините, если я скучаю, понимаю вас, фарка, но ни в одном из представленных ответов я не вижу ничего, что мешало бы вам делать то, что вы хотите.

Разве вы не можете просто сделать

for every item in the database
   get the match for C
   do something with it
   get the match for a
   do something with it

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

1 голос
/ 06 июня 2010

Обычно вам не нужно заботиться о порядке установки соответствующих параметров, так как вы можете изменить их в окружающем коде. Чтобы сделать такое «нормальное» совпадение, вам нужно что-то вроде этого:

a=(\d+)\s+B=\d+\s+C=(\d+)

Ваше выражение ищет бит C = или бит a =: они не будут совпадать одновременно. Также, как было указано выше, «^» не поможет.

Я не знаю ни одного простого способа переключать соответствие внутри механизма регулярных выражений. Это может быть возможно с интересным использованием положительного оглядки назад (поиск бита после того, как бит C сопоставлен, но я не знаю, что порядок совпадающих переменных хорошо определен в таком случае), но это, безусловно возможно в окружающем коде. Один из компактных (некрасивых и, вероятно, небезопасных) способов достижения этого заключается в использовании функции eval в чем-то вроде perl для перезаписи имен соответствующих переменных. Это работает для меня:

eval(s/a=(\d+) B=\d+ C=(\d+)/\$1=$2 \$2=$1/);
print "$1 \n"; #gives 65
print "$2 \n"; #gives 27

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

0 голосов
/ 06 июня 2010

Регулярное выражение в соответствии с тем, что вам нужно:

A=(\d+) B=\d+ C=(\d+)

Но тогда вам нужно собрать выходные данные следующим образом (зависит от используемого вами инструмента или языка программирования):

\2 \1

Это \2, за которым следует \1, потому что вы хотите сначала значение C, а затем значение A. Эти числа отражают порядок, в котором выражения в скобках находятся в регулярном выражении.

Примечание: Я проверял это выражение с помощью Notepad ++ инструмента поиска и замены.

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