【问题标题】:perl stream file for regex token including scanned tokens正则表达式令牌的 perl 流文件,包括扫描的令牌
【发布时间】:2013-03-06 13:13:11
【问题描述】:

我正在尝试在 perl 中流式传输文件并标记行并包含标记。

我有:

while( $line =~ /([\/][\d]*[%].*?[%][\d]*[\/]|[^\s]+|[\s]+)/g ) {
  my $word = $1;
  #...
}

但是当令牌中没有空格时它不起作用。

例如,如果我的行是:

$line = '/15%one (1)(2)%15/ is a /%good (1)%/ +/%number(2)%/.'

我想将该行拆分为:

$output =
[
  '/15%one (1)(2)%15/',
  ' ',
  'is',
  ' ',
  'a',
  '/%good (1)%/',
  ' ',
  '+',
  '/%number(2)%/',
  '.'
]

最好的方法是什么?

【问题讨论】:

    标签: regex perl tokenize


    【解决方案1】:

    (?:(?!STRING).)*STRING 就像 [^CHAR]*CHAR,所以

    my @tokens;
    push @tokens, $1
       while $line =~ m{
          \G
          ( \s+
          | ([\/])([0-9]*)%
            (?: (?! %\3\2 ). )*
            %\3\2
          | (?: (?! [\/][0-9]*% )\S )+
          )
       }sxg;
    

    但这不成立。如果你想验证,你可以使用

    my @tokens;
    push @tokens, $1
       while $line =~ m{
          \G
          ( \s+
          | ([\/])([0-9]*)%
            (?: (?! %\3\2 ). )*
            %\3\2
          | (?: (?! [\/][0-9]*% )\S )+
          | \z (*COMMIT) (*FAIL)
          | (?{ die "Syntax error" })
          )
       }sxg;
    

    以下内容也可以验证,但它更具可读性,并且易于区分令牌类型。:

    my @tokens;
    for ($line) {
       m{\G ( \s+ ) }sxgc
          && do { push @tokens, $1; redo };
    
       m{\G ( ([\/])([0-9]*)%  (?: (?! %\3\2 ). )*  %\3\2 ) }sxgc
          && do { push @tokens, $1; redo };
    
       m{\G ( (?: (?! [\/][0-9]*% )\S )+ ) }sxgc
          && do { push @tokens, $1; redo };
    
       m{\G \z }sxgc
          && last;
    
       die "Syntax error";
    }
    

    pos 将为您提供有关错误发生位置的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多