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