将 BibTeX 作者字段拆分为多个部分
Split a BibTeX author field into parts
我正在尝试使用以下语法解析 BibTeX 作者字段:
use v6;
use Grammar::Tracer;
# Extract BibTeX author parts from string. The parts are separated
# by a comma and optional space around the comma
grammar Author {
token TOP {
<all-text>
}
token all-text {
[<author-part> [[\s* ',' \s*] || [\s* $]]]+
}
token author-part {
[<-[\s,]> || [\s* <!before ','>]]+
}
}
my $str = "Rockhold, Mark L";
my $result = Author.parse( $str );
say $result;
输出:
TOP
| all-text
| | author-part
| | * MATCH "Rockhold"
| | author-part
但是程序在这里挂起(我必须按 CTRL-C)才能中止。
我怀疑问题与否定前瞻断言有关。我试图删除它,然后程序不再挂起,但是我也无法使用内部 space.
提取最后一部分 "Mark L"
请注意,出于调试目的,上面的 Author
语法是我实际程序中使用的语法的简化版本。
表达式[\s* <!before ','>]
可能没有任何进展。由于它在量词中,它会一次又一次地重试(但不会继续),导致观察到挂起。
这样的构造将可靠地挂在字符串的末尾;做 [\s* <!before ',' || $>]
通过使前瞻在字符串末尾也失败来修复它(在字符串末尾是不在 ,
之前的有效方法)。
至少对于这个简单的示例,看起来整个 author-part
标记可能只是 <-[,]>+
,但对于从中减少的实际问题来说,这可能过于简单化了。
扫一眼 all-text
,我还要指出 % quantifier modifier 这使得匹配 comma-separated(或 anything-separated,真的)变得更容易。
我正在尝试使用以下语法解析 BibTeX 作者字段:
use v6;
use Grammar::Tracer;
# Extract BibTeX author parts from string. The parts are separated
# by a comma and optional space around the comma
grammar Author {
token TOP {
<all-text>
}
token all-text {
[<author-part> [[\s* ',' \s*] || [\s* $]]]+
}
token author-part {
[<-[\s,]> || [\s* <!before ','>]]+
}
}
my $str = "Rockhold, Mark L";
my $result = Author.parse( $str );
say $result;
输出:
TOP
| all-text
| | author-part
| | * MATCH "Rockhold"
| | author-part
但是程序在这里挂起(我必须按 CTRL-C)才能中止。 我怀疑问题与否定前瞻断言有关。我试图删除它,然后程序不再挂起,但是我也无法使用内部 space.
提取最后一部分"Mark L"
请注意,出于调试目的,上面的 Author
语法是我实际程序中使用的语法的简化版本。
表达式[\s* <!before ','>]
可能没有任何进展。由于它在量词中,它会一次又一次地重试(但不会继续),导致观察到挂起。
这样的构造将可靠地挂在字符串的末尾;做 [\s* <!before ',' || $>]
通过使前瞻在字符串末尾也失败来修复它(在字符串末尾是不在 ,
之前的有效方法)。
至少对于这个简单的示例,看起来整个 author-part
标记可能只是 <-[,]>+
,但对于从中减少的实际问题来说,这可能过于简单化了。
扫一眼 all-text
,我还要指出 % quantifier modifier 这使得匹配 comma-separated(或 anything-separated,真的)变得更容易。