RegEx для захвата значений в строке в группу, независимо от порядка? - PullRequest
0 голосов
/ 14 июля 2011

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

ValueA ValueD ValueS ValueR ValueW ValueT
ValueX ValueW ValueB ValueM ValueQ ValueA

Etc. Если я хочу записать ValueA в группу захвата 1 и ValueW в группу захвата 2, могу ли я сделать это, используя одно регулярное выражение, которое обрабатывает вещи независимо от положения в каждой строке текста рассматриваемых значений?

Цель состоит в том, чтобы затем использовать группы захвата, чтобы записать обратно в файл два захваченных значения, чтобы я мог их упорядочить, то есть «ValueW ValueA».

Ответы [ 4 ]

1 голос
/ 14 июля 2011

Вы можете использовать что-то вроде:

^(?=.*?(ValueA))(?=.*?(ValueW)).*

Пример Perl:

$_ = <<'_STR_';
ValueA ValueD ValueS ValueR ValueW ValueT
ValueX ValueW ValueB ValueM ValueQ ValueA
_STR_

s/^(?=.*?(ValueA))(?=.*?(ValueW)).*/$1 $2/gm;

print;

Вывод:

ValueA ValueW
ValueA ValueW

Также на http://ideone.com/IhGfS

Примечание. Если вы просто сопоставляете, этот последний .* вам не понадобится, и в зависимости от того, насколько хорошо сопоставлены шаблоны ValueX, вы можете удалить все ?.

0 голосов
/ 14 июля 2011

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

0 голосов
/ 14 июля 2011

Это злоупотребление регулярным выражением - позвоните в полицию!

Серьезно ... если вам нужно это сделать, вы можете использовать оператор или (|) в каждой группе, чтобы выбрать одно или другое из двух слов.

0 голосов
/ 14 июля 2011

Примерно так:

(?<ValueA>ValueA)|(?<ValueW>ValueW)
...