我有一個字串:
{value1} {value2}-{value3}*{value...n}
使用正則運算式,我想捕獲每個括號內的值以及它們之間的運算子,但我不知道會有多少個括號。
我試過:
/(\{.*\}).*([\ |\-|\*|\/])*/mgU
但這只是讓我獲得價值而不是運營商。我哪里做錯了?
uj5u.com熱心網友回復:
您可以先驗證字串
/\A ({ [^{}]* }) (?: [\/ *-] (?1))* \z/x
詳情:
\A- 字串的開始({[^{}]*})-第1組:一個{比其它任何零個或多個字符{和}再}炭(?:[\/ *-](?1))*-零個或多個的/,,*或-炭和然后將組1圖案\z- 字串的結尾。
然后,您可以收集個人匹配
/ { [^{}]* } | [\/ *-] /gx
此正則運算式之間的任何串的所有出現匹配{和}(與{[^{}]*})或/, ,*或-字符(含[\/ *-])。
查看完整的演示腳本:
#!/usr/bin/perl
use strict;
use warnings;
my $text = "{value1} {value2}-{value3}*{value...n}";
if ($text =~ /\A ({ [^{}]* }) (?: [\/ *-] (?1))* \z/x) {
while($text =~ / { [^{}]* } | [\/ *-] /gx) {
print "$&\n";
}
}
輸出:
{value1}
{value2}
-
{value3}
*
{value...n}
uj5u.com熱心網友回復:
另一個想法可能是使用\G錨點和 2 個捕獲組,其中卷曲值在組 1 中,運算子在組 2 中:
\G(?=.*{[^{}]*}\z)({[^{}]*})([ *\/-])?
模式匹配
\G在前一個匹配的末尾或字串的開頭(在這種情況下)斷言位置(?=.*{[^{}]*}\z)正向前瞻,斷言字串以卷曲部分結尾({[^{}]*})捕獲第 1 組中的花括號([ *\/-])?可選地捕獲組 2 中的操作員
正則運算式演示| Perl 演示
例子
my $str = "{value1} {value2}-{value3}*{value...n}";
while ($str =~ /\G(?=.*\{[^{}]*}\z)({[^{}]*})([ *\/-])?/g) {
print "Curly value: $1 Operator: $2\n";
}
輸出
Curly value: {value1} Operator:
Curly value: {value2} Operator: -
Curly value: {value3} Operator: *
Curly value: {value...n} Operator:
uj5u.com熱心網友回復:
分詞器方法:
my @tokens;
for ($str) {
while (1) {
/\G \s /xgc;
/\G \{ ( [^{}]* ) \} /xgc
and do { push @tokens, [ VALUE => $1 ]; next; };
/\G ( [ -*\/] ) /xgc
and do { push @tokens, [ OP => $1 ]; next; };
/\G \Z /xgc
and last;
die( "Unexpected character at pos ".( pos )."\n" );
}
}
這可能有點矯枉過正,但更容易擴展。
uj5u.com熱心網友回復:
如果您只有非嵌套塊,由已知的運算子串列分隔,則可以使用split將陳述句非常輕松地分為值和運算子。
use strict;
use warnings;
use Data::Dumper;
my @val = split m#([- /*])#, <DATA>; # parens will prevent operators from being consumed
print Dumper \@val;
__DATA__
{value1} {value2}-{value3}*{valuen}/{value4} {value5}-{value6}*{valuen} {value7} {value8}-{value9}
這將列印:
$VAR1 = [
'{value1}',
' ',
'{value2}',
'-',
'{value3}',
'*',
'{valuen}',
'/',
'{value4}',
' ',
'{value5}',
'-',
'{value6}',
'*',
'{valuen}',
' ',
'{value7}',
' ',
'{value8}',
'-',
'{value9}
'
];
從那里開始,驗證和清理值以及識別運算子應該是一項簡單的任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/383630.html
上一篇:如何使用正則運算式在句號后添加缺失的空格,而不更改小數
下一篇:如何在捕獲組結束時重置整個匹配?
