我想使用以下正则表达式捕获几个文本:
$text_normal = qr{^(\/F\d+) FF (.*?) SCF SF (.*?) MV (\(.*?)SH$};
字符串的示例如下所示:
my $text = '/F12345 FF FF this is SCF SF really MV (important stuff SH';
可以重写以加快匹配吗?
bri*_*foy 19
优化正则表达式没有单一的答案.您可以通过re pragma 观察特定正则表达式正在执行的操作:
 use re 'debugcolor';
一旦你看到它遍历字符串,你会看到它出现问题的位置并从那里调整你的正则表达式.当你这样做时,你将学习一些关于正则表达式引擎的知识.
您还应该查看Mastering Regular Expressions,它可以告诉您正则表达式如何工作以及为什么某些模式比其他模式慢.
没有看到一些样本数据,很难说.
通常,避免使用是个好主意.*.寻找任何可能的不需要的回溯来源,并消除它们.
split如果您的需求很简单,您可以通过切片来逃脱.
 my @vals = (split / /, $string)[0,2,5,7];
这在很大程度上取决于您扫描的数据的配置文件.
您可以做的是识别RE中过滤掉最多输入的部分,并为该表达式单独执行更简单的RE.
例如,如果只有5%的输入日期包含'MV'字符串,则可以先对此进行过滤,只应用更复杂的RE(如果更简单的一个为真)
所以你会:
if ( $text_normal =~ / MV / ) {
  $text_normal = qr{^(\/F\d+) FF (.*?) SCF SF (.*?) MV (\(.*?)SH$};
  if .......
  }
}
| 归档时间: | 
 | 
| 查看次数: | 5518 次 | 
| 最近记录: |