Как игнорировать пробелы в строке темы регулярного выражения, но только если они идут после новой строки? - PullRequest
3 голосов
/ 04 января 2011

Каков наилучший способ игнорировать пробелы в целевой строке при поиске совпадений с использованием шаблона регулярного выражения, но только если пробел идет после новой строки (\ n)?Например, если мой поиск для «котов», я бы хотел, чтобы «c \ n ats» или «ca \ n ts» соответствовали, но не «c ats», поскольку пробел не идет после новой строки.Я не могу заранее удалить пробелы, потому что мне нужно найти начальный и конечный индексы совпадения (включая любые пробелы), чтобы выделить это совпадение, и любые пробелы должны быть там для форматирования.

Ответы [ 3 ]

3 голосов
/ 04 января 2011

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

(?<=\n)\s
2 голосов
/ 04 января 2011

"Каков наилучший способ игнорировать пробелы в целевой строке при поиске совпадений с использованием шаблона регулярного выражения"

Я бы построил регулярное выражение динамически, вставив (?:\n\s)? между каждым символом.

use strict;
use warnings;

my $needed = 'cats';
my $regex = join '(?:\n\s)?' , split ( '',$needed );

print "\nRegex = $regex\n", '-'x40, "\n\n";

my $target = "
   cats
   c ats
   c\n ats
   ca ts
   ca\n ts
   cat s
   cat\n s
";

while ( $target =~ /($regex)/g)
{
    print "Found -  '$1'\n\n";
}

Выход:

Regex = c(?:\n\s)?a(?:\n\s)?t(?:\n\s)?s
----------------------------------------

Found -  'cats'

Found -  'c
 ats'

Found -  'ca
 ts'

Found -  'cat
 s'
0 голосов
/ 04 января 2011

Я сделал небольшой фрагмент рубина на основе правил, которые вы перечислили.Это то, что вы ищете?

data = <<DATA
test1c\n atsOKexpected

test2ca\n tsOKexpected

test3catsOKexpected

test5ca tsBADexpected

test6 catsOKexpected

test7cats OKexpected
DATA

tests = data.split(/\n\n/)

regex = /c(\n )?a(\n )?t(\n )?s/

tests.each do |s|
  if s =~ regex
    puts "OK\n#{s}\n\n"
  else
    puts "BAD\n#{s}\n\n"
  end
end

# RESULTS
# OK
# test1c
#  atsOKexpected
# 
# OK
# test2ca
#  tsOKexpected
# 
# OK
# test3catsOKexpected
# 
# BAD
# test5ca tsBADexpected
# 
# OK
# test6 catsOKexpected
# 
# OK
# test7cats OKexpected
...