我需要一个匹配完全关键字以及特殊字符或运算符的正则表达式。
例如,我有一个字符串,我想用正则表达式拆分它。
my $data="long i = sbyte.MinValue ; i => sbyte.MaxValue ; > i++";
如果我在等号=
上拆分它,那么它应该返回两个字符串:
long i
sbyte.MinValue ; i => sbyte.MaxValue ; > i++
如果我与=>
分开,那么它将返回:
long i = sbyte.MinValue ; i
sbyte.MaxValue ; > i++
以下是示例代码:
my $key = "=";
my $data = "long i = sbyte.MinValue ; i => sbyte.MaxValue ; > i++";
#=~/\b$s\b/
#/\b$key\b/
my @matches = ( $data =~/\b$key\b/ );
my @string = split (/\b$key\b/, $data); # split ~ /^=$/, $data;
if ( scalar(@string) > 0 ) {
foreach my $item ( @string ) {
print "$item \n";
}
}
else {
print "Nothing found \n";
}
问题在于运营商要搜索并拆分字符串。
完全匹配与关键字或其他文本一起使用,但与运算符匹配
比如=
,>=
,<=
,!=
,<<=
,=>>
,++
,--
它不是工作
我需要逐个搜索并拆分文本。
答案 0 :(得分:0)
您可以尝试使用tokenizer来处理为您解析字符串,以免重新发明轮子。以下是使用PPI::Tokenizer
的示例#!/usr/bin/env perl
use strict;
use warnings;
use List::MoreUtils qw( any );
use PPI::Tokenizer;
my @operators_i_care_about = qw( = => >= <= != <<= =>> ++ -- );
my $data = "long i = sbyte.MinValue ; i => sbyte.MaxValue ; > i++";
my $tokenizer = PPI::Tokenizer->new( \$data );
for my $token ( @{ $tokenizer->all_tokens } ) {
if ( 'PPI::Token::Operator' eq ref $token
and any { $_ eq $token->content } @operators_i_care_about ) {
print "\nOPERATOR: $token\n";
} else {
print $token; # Stringifies
}
}
<强>输出强>
long i
OPERATOR: =
sbyte.MinValue ; i
OPERATOR: =>
sbyte.MaxValue ; > i
OPERATOR: ++
答案 1 :(得分:0)
我仍然对你要做的事情非常朦胧,但我在你的代码中看到的直接问题是你的正则表达式为\b=\b
而等号是=
出现在目标字符串中,前面只有空格,后跟空格或大于号>
零宽度模式\b
匹配单词字符和非单词字符之间的位置或字符串的开头或结尾
单词字符仅包括大写和小写字母,十进制数字和下划线_
,因此等于,空格和大于所有非单词字符,并且您的正则表达式模式在字符串中无处匹配
您可能认为等号被空格字符包围,您可以使用\s=\s
执行此操作,或者您希望字符串的开头和结尾与它们的工作方式相同对于\b
,您可以使用(?<!\S)=(?!\S)