【发布时间】:2021-11-02 16:04:11
【问题描述】:
我已经在一个沙盒项目中安装了 nette/tokenizer https://packagist.org/packages/nette/tokenizer 来玩令牌化。
“基本”规则定义
最基本的测试是玩他们在这里给出的例子:https://doc.nette.org/en/3.1/tokenizer#toc-string-tokenization由这3条规则组成:
$languagePatterns[ 'basic' ] = [
'number' => '\d+',
'whitespace' => '\s+',
'string' => '\w+',
];
我称这种语言为“基础”,这是我测试的输入:
There were 101 dalmatians
There were 101 dalmatians
我在输出中用颜色绘制每个标记,效果很好:
“括号”规则定义
我现在想尝试识别“括号中的块”并让其余部分保持不变。例如对于这个输入:
There were (more than) 101 dalmatians
(more than) 块应该是一个标记,其余的标记为基本语言(区分字符词、空格和数字)。所以输出应该是:
"string": "There"
"whitespace": " "
"string": "were"
"whitespace": " "
"group": "(more than)"
"whitespace": " "
"number": "101"
"whitespace": " "
"string": "dalmatians"
所以我保留了我的规则,并添加了一条新规则group,如下所示:
$languagePatterns[ 'parentheses' ] = [
'number' => '\d+',
'whitespace' => '\s+',
'string' => '\w+',
'group' => '\((.*)\)',
];
它有效:
问题
我现在想这样标记:
- “括号块”是一个标记
- “任何其他”是另一个标记。
例如输入
There were (more than) 101 dalmatians
应该被标记为:
"anything": "There were "
"group": "(more than)"
"anything": " 101 dalmatians"
我尝试了这样的规则:
$languagePatterns[ 'parentheses2' ] = [
'whatever' => '.*',
'group' => '\((.*)\)',
];
我得到一个完整的匹配:
或者如果规则的顺序有影响,我会尝试那些(首先匹配括号块,然后是其他任何东西):
$languagePatterns[ 'parentheses2' ] = [
'group' => '\((.*)\)',
'whatever' => '.*',
];
然后我什么都不匹配。
问题
我想知道我应该在 PHP 中放置什么规则以使 nette/tokenizer 按预期运行。
【问题讨论】:
-
'whatever' => '[^()]+' -
经过测试,它可以工作!您能否将其设置为答案以便选择它?此外,对于所有读者来说,如果你能善意地表达它的作用,那就太棒了。
-
XRef:我提出这个问题是为了解决另一个问题stackoverflow.com/questions/68988193/…
-
XRef:添加对@Lone Learner 的旧问题的引用,该问题也在寻求如何匹配“其他所有内容”stackoverflow.com/questions/27217075/…
标签: regex tokenize regular-language nette