【问题标题】:A regex to match this or exactly that匹配这个或完全匹配的正则表达式
【发布时间】:2015-06-30 19:37:38
【问题描述】:

我正在尝试在 LDT JavaScript 插件之上编写一个 Markdown 解析器,它允许一种实时解析。它具有基本功能,其中之一是使用正则表达式的自定义解析器。

在尝试实现 Markdown“解析器”时,我卡在了列表上。我要匹配

- This string
* and that string

确切地说

1. A string that starts with a number whic must be followed by a period.

因此,在创建解析器时,所有条目都被连接并用管道分隔 (|)。模板为:new Regexp("^("+s+")$")

我当前的正则表达式匹配无序列表:

 /[-\*]\s[^\n\r]*\n?/

...但这也匹配在一行的中心。

匹配-* 前缀字符串或数字前缀字符串但必须有句点的正则表达式是什么?

【问题讨论】:

  • 为什么不给我们您的输入和您想要的输出? :D
  • 不推荐使用正则表达式进行解析。正则表达式是一个小型模式引擎。这个问题可以回答,但从长远来看,用 Regex 解析 Markdown 可能不是你最好的选择。
  • 这个工作吗:/^([-*]|\d\.)\s(.*)$/gm
  • Sam:这匹配编号的行,末尾没有句点。我的不优雅,但你可以试试。 regex101
  • 您将隐喻与描述混合在一起。不要说 template 是一些正则表达式语法,它不是。这个^("+s+")$" 非常晦涩。我很确定你可以用正则表达式解析任何东西。很多时候是分阶段进行的。

标签: javascript regex parsing


【解决方案1】:

如果这是处理所需任务的正确/错误方式,请避免讨论,您可以使用两个group captures and beginning/end line boundaries。第一个组捕获将允许您测试如果有匹配,它是什么类型的列表。

var strings = [
  '- This string',
  '* and that string',
  '1. A string that starts with a number which must be followed by a period.',
  'Bad string',
  '-Bad string', 
  '*Bad string',
  '2 Bad string.'
];

var matchRegExp = /^(\d\.|\*|\-)\s(.+)$/;

var res = strings.map(function (str) {
  return { str: str, match: str.match(matchRegExp) };
});

document.write('<pre>' + JSON.stringify(res, null, 4) + '</pre>');

【讨论】:

  • +1,但对于挑剔的人有几点注意事项:1)。 - 不需要在字符类之外转义(甚至不需要作为类中的第一个/最后一个字符进行转义),2)。 \*|\- 可以缩短为 [*-], 3)。结尾的 $ 可能有利于可读性,但在以贪婪的点匹配结尾时是不必要的。
  • @Sam 同意,但我打算在风格/性能方面考虑可读性
  • @JasonCust 非常感谢。这对我有用。我在 ocmmand 行上使用 Nodejs 对其进行了测试,它与我希望它匹配的内容相匹配。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多