首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl解析字符串末尾的空白字符

Perl解析字符串末尾的空白字符
EN

Stack Overflow用户
提问于 2012-12-21 19:00:14
回答 3查看 136关注 0票数 1
代码语言:javascript
复制
MMAPI_CLOCK_OUTPUTS = 1,        /*clock outputs system*/

用这个来解析上面的代码:

代码语言:javascript
复制
$TheLine =~ /\s*(.*)\s*=\s*(.*),\s*\/\*(.*)\*\//)

变量$1在末尾包含空白,例如我们有"MMAPI_CLOCK_OUTPUTS "而没有"MMAPI_CLOCK_OUTPUTS"。为什么这些空间也会被捕获?我认为应该在解析器代码中删除它们。

EN

回答 3

Stack Overflow用户

发布于 2012-12-21 19:09:20

正则表达式捕获(.*)是贪婪的匹配,这意味着它将匹配尽可能多的字符。由于以下\s*的长度可以为零,因此捕获中包含包含空格的前面的字符串。

通过添加问号(.*?)将其更改为非贪婪模式,并使用不同的分隔符,以避免必须转义模式中的斜杠

代码语言:javascript
复制
$TheLine =~ m<\s*(.*?)\s*=\s*(.*),\s*/\*(.*)\*/>
票数 8
EN

Stack Overflow用户

发布于 2012-12-21 23:44:42

TIMTOWTDI,或者“我很久没用过Regexp::Grammars了”

代码语言:javascript
复制
#!/usr/bin/env perl

use strict;
use warnings;

use Regexp::Grammars;
my $parser = qr{
  <nocontext:>

  <Definitions>

  <rule: Definitions>   <[Definition]>*
  <rule: Definition>    <Variable> = <Value>
  <rule: Variable>  <Word>
  <rule: Value>     <Word>
  <rule: Word>      [\w\d_]+
}xms;

my $str = 'MMAPI_CLOCK_OUTPUTS = 1,        /*clock outputs system*/';

$str =~ $parser;

# see the whole matched structure
use Data::Dumper;
print Dumper \%/; 

# or walk the structure for results
for my $def (@{ $/{Definitions}{Definition} }) {
  print $def->{Variable}{Word} . ' => ' . $def->{Value}{Word} . "\n";
}
票数 1
EN

Stack Overflow用户

发布于 2012-12-21 19:08:24

如果=符号前的单词没有空格,请将(.*)更改为(\S+)

代码语言:javascript
复制
$TheLine =~ /\s*(\S+)\s*=\s*(.*),\s*\/\*(.*)\*\//)
           here __^
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13988885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档