Регулярное выражение для захвата слов между определенным словом - PullRequest
4 голосов
/ 09 августа 2011

Я пытаюсь получить регулярное выражение, которое соответствует: (не должно совпадать ни с одной другой строкой)

Word1 or Word2 or Word3 or Wordn

Захват слов до или после "или"

1: Word1
2: Word2
3: Word3
n: Wordn

Я пытался изменить регулярное выражение CSV:

(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)

до

(?:^|(?:or)((?:[^(?:or)]+)*|[^(?:or)]*)

Но это не дает мне того, чего я хочу.

Я уверен, что что-то упустил, но я бился головой много часов.

Ответы [ 5 ]

1 голос
/ 10 августа 2011

Как насчет:

my $string = "  foo or    bar or  foobar ";
if ( $string =~ m|^\s*[^\s]+(\s+or\s+[^\s]+)+\s*$| ) {
    my $tmp = "$string";
    $tmp =~ s|^\s+||;
    $tmp =~ s|\s+$||;
    my @words = split( /\s+or\s+/, $tmp );
    printf( "Found %d words:\n", scalar( @words ) );
    foreach my $word ( @words ) {
        print( "\t'$word'\n" );
    }
} else {
    print( "No match\n" );
}

Выше будет выводиться:

Found 3 words:
    'foo'
    'bar'
    'foobar'
1 голос
/ 09 августа 2011

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

my @words = split / or /, $string;
1 голос
/ 09 августа 2011

Попробуйте разбить строку на ' or '.

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

Реальное решение - разделить на ' or '. Решение регулярных выражений не так просто.

$sm =~ / or / and @between_or = $sm =~ /(?:^\s*|(?<= or ))(.+?)(?= or |\s*$)/sg;

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

Это регулярное выражение будет соответствовать любой строке, которая имеет по крайней мере word1 or word2, и любому числу больше или после этого.У него также не должно быть пробелов в начале или конце строки, но вы можете удалить ^ и $, если хотите найти строку этой формы в пределах строки большего размера

(?:^(\w+)(?=\s+or))|(?:\s+or\s+(\w+))+

RegexPal

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