【问题标题】:Weird regex behavior using codemirror's simple mode使用 codemirror 的简单模式的奇怪正则表达式行为
【发布时间】:2017-12-13 01:21:51
【问题描述】:

我正在尝试创建一个允许 Todo.txt 格式的模式,该格式非常简单,但在 codemirror 匹配结果时会出现奇怪的正则表达式行为。

基本上,我试图标记所有行以空格字符后的“x”开头,并且仅在行首具有此条件,但正则表达式会在行中间选择一个字符串。

在尝试使用其他 javascript 正则表达式工具时,我的正则表达式与此条件不匹配:https://regex101.com/r/kUXTqf/1

这是我的简单模式定义中的正则表达式行:

{regex: /^(x ).*$/, token: "task-completed"} 

以及我正在测试的文本:

x 2017-12-12 @geek add file location preference option +todotxtapp
(A) @geek completed task syntax highlighter rule needs tweak - it includes any character follows with whitespace - starting in the middle of the line +todotxtapp
(B) @geek design new app icon +todotxtapp
(C) @geek add priority shortcut cmd+up/down or similar +todotxtapp
asdasdasdasdasa x dsljhdsfkljg dhsklf sdaf

实际上,它只需要匹配第一行。但它匹配第二行和最后一行的一半。 在此处查看结果:http://take.ms/S2PEL

【问题讨论】:

  • 奇怪,我找不到讨论这种行为的文档。正如您的工作 Regex101 演示所示,我希望您的模式能够按照您的想法工作。

标签: javascript regex codemirror


【解决方案1】:

我不熟悉 CodeMirror,但不熟悉文档,

简单模式(松散地基于通用 JavaScript 语法突出显示规范,从未流行过)是状态机,其中每个状态都有许多匹配标记的规则。

正则表达式不适用于行,它适用于 tokens。因此,asdasdasdasdasaxdsljhdsfklhg 都是单独测试的;不出所料,x 匹配 /^(x ).*$/

您似乎想要这样的东西(您可能需要调整它,因为我无法测试它):

{regex: /x/, token: "task-completed", sol: true} 

sol: 布尔值

当为 true 时,此标记将仅在行首匹配。 (由于 JavaScript 的 RegExp API 的限制,^ regexp 标记在这种情况下无法正常工作。)

编辑:我必须说,我不太确定syntax 发生了什么。

【讨论】:

  • 感谢 Amadan,在尝试之前,我阅读了简单模式的源代码,它只是在规则定义中检查 sol。你的建议很有效。
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多