首页 > 解决方案 > 如何忽略模式锚前一行中的任意数量的制表符、空格?

问题描述

我正在尝试使用特定的文本格式来捕捉非常广泛的句子和单词。我正在使用 JS 正则表达式,但 Perl 正则表达式也是一种选择。

示例输入:

(Name) + modifier1 modifier2 +
Some (ideas) sentences, words?! and ellipses…

(Name2) + modifier1 modifier4 modifier 16 +
Other words (... punctuation) sentences, words?! etc.

我的“终极”;) 目标是捕获一个字符串,以便进一步划分为具有名称变量、修饰符 [] 向量和对话“一些(想法)句子、单词?!和省略号……”的子字符串。

在输入的第一行中,应捕获 () 括号、+ 符号和单词。然后在 + 之后有一个换行符。在第二行中,我想从 (?<=\n) 开始捕获并包括第一个字符 [a-zA-Z()-,.;?!'''\u2026] 然后捕获任何这样的字符'\s''~'':' [a-zA-Z()-~:,.;?!'''\u2026 ]{0,}. 第二行捕获在第二个换行符之后结束。'\u2026' 表示省略号。

我目前 99% 的工作正则表达式:

(^\()[a-zA-Z1-9()\+ ]{2,}(?=\n)|(?<=\n)[a-zA-Z()\-,.;?!'’‘\u2026][a-zA-Z()\-~:,.;?!'’‘\u2026 ]{0,}(?=\n)

边缘情况存在一些问题:

  1. 如果第一行前面有 '\t' 制表符或 '\s' 空格,则 (^() 锚将排除整行。它应该忽略格式并从并包括 '(' 括号开始。
  2. 如果我正在阅读的文档没有换行符,我的最后一个模式将不匹配。

我可以做哪些改进来处理边缘情况?有没有办法使用 ^ 行锚,但忽略前面的制表符和空格?

标签: regex

解决方案


试试这个:((?:^|\n)\s*\((?<name>[^)]+)\)\s*\+\s*(?<modifiers>[^+]*)\s*\+\n)?\s*(?<head>[^(]*)\((?<ideas>[^)]*)\)\s*(?<tail>[^\n]*)g标志。

我重新编写了正则表达式,尽可能少地假设有效字符,还添加了一些命名捕获。

https://regex101.com/r/3JgnhF/2


推荐阅读