繁体   English   中英

如何有选择地向捕获组添加逗号和空格?

[英]How to optionally add a comma and whitespace to a capture group?

我正在尝试在每个文本块中匹配五个子字符串(总共有100个块)。

我匹配了99%的文本块,但是关于第3组和第4组有一些错误。

这是一个演示链接: https : //regex101.com/r/cW2Is3/4

第3组是“词性”,第4组是英语翻译。

在第一段文本中, det, pro应该都在第3组中,然后the; him, her, it, them the; him, her, it, them应该在第4组中。

在第三段文本中再次出现相同的问题。
第3组应为adj, det, nm, pro ,第4组应为a, an, one

这是我的模式:

([0-9]+)\s+(\w+(?:, \w+)?)\s+(\N+?)\s+(\H.+).*?\r?\n•\s+([\s\S]*?)\s+[0-9]+\s\|.*\s*

Voici ...

/^(\d+) +(\w+) +([acdefijlmnoprtv()]+(?:, ?[acdefijlmnoprtv()]+)*) +([\S\s]+?)\n\x{2022} +([\S\s]+?)\n\d+ \| [-\dn]+\s*/gum

演示链接

我已经尽力优化了模式。 我从您的模式中减少了近10,000个步骤,并根据需要达到了100个匹配项。

  • 起始锚^用于标识每个块的起始(效率/准确度)
  • \\d代替[0-9] (简洁)
  • \\s在适用的地方用文字空间代替(简洁)
  • 对于捕获组3,使用特定字母和括号的字符类代替\\w 。(效率)*为简洁起见,可以用[\\w()]替换,以免造成效率降低
  • 项目符号是使用文字\\x{2022} (个人首选项)
  • 每个块[-\\dn]结尾字符上使用的字符类。 (效率/准确度)

当您必须描述包含许多部分的长字符串时,第一个反射就是使用自由空间模式(x修饰符)和命名组(即使命​​名组在替换上下文中不是很有用,它们也有助于使模式可读,更易于调试):

~^
(?<No> [0-9]+ )  \h+
(?<word> \pL+ )  \h+
(?<type> [\pL()]+ (?: , \h* [\pL()]+ )* )  \h+
(?<wd_tr> [^•]* [^•\s] )  \h* \R

• \h*
(?<sent_fr> [^–]* [^\s–] )   \s* – \s*
(?<sent_eng> .* (?:\R .*)*? )  \h* \R

(?<num1> [0-9]+ )  \h* \| \h*
(?<num2> .*\S )
~xum

演示

没有神奇的方法可以为格式模糊的字符串构建模式。 您可以做的就是一开始就采取最严格的措施,并在遇到不匹配的案件时增加灵活性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM