regex - 如何忽略模式锚前一行中的任意数量的制表符、空格?
问题描述
我正在尝试使用特定的文本格式来捕捉非常广泛的句子和单词。我正在使用 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)
边缘情况存在一些问题:
- 如果第一行前面有 '\t' 制表符或 '\s' 空格,则 (^() 锚将排除整行。它应该忽略格式并从并包括 '(' 括号开始。
- 如果我正在阅读的文档没有换行符,我的最后一个模式将不匹配。
我可以做哪些改进来处理边缘情况?有没有办法使用 ^ 行锚,但忽略前面的制表符和空格?
解决方案
试试这个:((?:^|\n)\s*\((?<name>[^)]+)\)\s*\+\s*(?<modifiers>[^+]*)\s*\+\n)?\s*(?<head>[^(]*)\((?<ideas>[^)]*)\)\s*(?<tail>[^\n]*)
带g
标志。
我重新编写了正则表达式,尽可能少地假设有效字符,还添加了一些命名捕获。
推荐阅读
- java - ChronicleMap 是改进的并发 HashMap 吗?
- java - 无法从父活动获取值到子活动 Android Studio
- c# - xamarin 将语音转换为文本不起作用
- javascript - Sequelize / Typescript:参数“值”和“值”的类型不兼容
- java - 如何在Java中的2个随机字符数组之间匹配指定的字符顺序?
- python - 在输出文件中列出项目和价格
- mapbox-gl-js - 如何使用 Turf.js 与 2 个以上的多边形相交?
- android - 如何下载 jcenter.bintray 整个存储库或
- reactjs - 顺风 css 侧边栏不固定
- python-3.x - Google Cloud Run 中的 SecretManagerServiceClient 和通过服务帐户进行身份验证