使用 Regex 查找不在评论中的 "goals" 范围
Find range of "goals" that aren't in comments with Regex
也许这很简单,但我还没有找到一种方法来实现正则表达式的以下行为。我想匹配以 {!
开头并以 !}
结尾的子字符串。我试过以下正则表达式:{!.*!}
。但我想排除那些以行 --
开头的内容。
例如,假设我们有三行:
-- Here is some comment {!0-goal!}
{!1-goal!}
Here is some text and {!3-goal!}
我想匹配 {!1-goal!}
和 {!2-goal!}
,但不匹配 {!0-goal!}
。有什么建议吗?
扩展问题:
事实证明,我还需要解析这种 "goals"。
https://regex101.com/r/xL1eY3/5
怎么样?我认为这可能很难实现,对吧?如果有人可以帮助我,我将非常感激。如果没有,我将在 Objective-C 中为此编写自己的解析器,但出于明显的原因我想避免这种情况:)
您可以使用捕获组执行此操作:
^(?!--).*(\{![^!]*!\})
请注意此正则表达式需要一个 m
(多行)标志。在 Objective-C 中,那将是 NSRegularExpressionAnchorsMatchLines。并获取存储在第一个捕获组中的值。
参见demo。
编辑:
仅使用正则表达式无法获得更新输入的结果。问题是 Objective C 正则表达式不支持可变宽度后视。所以,你需要的解决方案是
- 逐行处理
- 如果一行以
--
开头,则丢弃它
- 如果一行不是以
--
开头,请应用 (?=(\{!(?:[^!]|\{![^!]*!\})*!\}))
正则表达式。
您可以使用以下方式进行匹配:
/^(?!\s*--).*({!(?:(?!!}).)+!})/gm
并提取 </code>(第 1 组)</p>
<p>见<a href="https://regex101.com/r/nX6cI0/1" rel="nofollow">DEMO</a></p>
<p>解释:</p>
<ul>
<li><code>^(?!\s*--)
以 --
或 (space) --
以外的任何内容开始的前瞻断言
也许这很简单,但我还没有找到一种方法来实现正则表达式的以下行为。我想匹配以 {!
开头并以 !}
结尾的子字符串。我试过以下正则表达式:{!.*!}
。但我想排除那些以行 --
开头的内容。
例如,假设我们有三行:
-- Here is some comment {!0-goal!}
{!1-goal!}
Here is some text and {!3-goal!}
我想匹配 {!1-goal!}
和 {!2-goal!}
,但不匹配 {!0-goal!}
。有什么建议吗?
扩展问题:
事实证明,我还需要解析这种 "goals"。
https://regex101.com/r/xL1eY3/5
怎么样?我认为这可能很难实现,对吧?如果有人可以帮助我,我将非常感激。如果没有,我将在 Objective-C 中为此编写自己的解析器,但出于明显的原因我想避免这种情况:)
您可以使用捕获组执行此操作:
^(?!--).*(\{![^!]*!\})
请注意此正则表达式需要一个 m
(多行)标志。在 Objective-C 中,那将是 NSRegularExpressionAnchorsMatchLines。并获取存储在第一个捕获组中的值。
参见demo。
编辑:
仅使用正则表达式无法获得更新输入的结果。问题是 Objective C 正则表达式不支持可变宽度后视。所以,你需要的解决方案是
- 逐行处理
- 如果一行以
--
开头,则丢弃它 - 如果一行不是以
--
开头,请应用(?=(\{!(?:[^!]|\{![^!]*!\})*!\}))
正则表达式。
您可以使用以下方式进行匹配:
/^(?!\s*--).*({!(?:(?!!}).)+!})/gm
并提取 </code>(第 1 组)</p>
<p>见<a href="https://regex101.com/r/nX6cI0/1" rel="nofollow">DEMO</a></p>
<p>解释:</p>
<ul>
<li><code>^(?!\s*--)
以 --
或 (space) --
以外的任何内容开始的前瞻断言