如何忽略正则表达式主题字符串中的空格,但仅当它出现在换行符之后?

时间:2011-01-04 17:00:30

标签: regex newline whitespace

使用正则表达式模式搜索匹配项时,忽略目标字符串中的空格的最佳方法是什么,但仅当空格位于换行符后才会出现?(\ n)?例如,如果我的搜索是“猫”,我希望“c \ n ats”或“ca \ n ts”匹配但不是“c ats”,因为空格不是在换行符之后。我不能事先删除空格,因为我需要找到匹配的开始和结束索引(包括任何空格)以突出显示该匹配,并且任何空格都需要用于格式化目的。

3 个答案:

答案 0 :(得分:3)

如果您正在使用的正则表达式引擎支持环绕声断言,请使用正向lookbehind断言来检查是否存在前一个换行符:

(?<=\n)\s

答案 1 :(得分:2)

&#34;使用正则表达式模式搜索匹配项时,忽略目标字符串中空格的最佳方法是什么&#34;

我会动态构造一个正则表达式,在每个字符之间插入一个(?:\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'

答案 2 :(得分:0)

我根据您列出的规则制作了一个小红宝石片段。这是你在找什么?

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