【问题标题】:Regex finding entire line from paragraph正则表达式从段落中查找整行
【发布时间】:2023-01-27 02:33:28
【问题描述】:

我需要从段落中找到实际的行,由 markdown 编辑器绘制的段落你可以通过编辑器添加复选框、单选框、文本框和段落。

实际的 str 是这样的,

  this is paragraph line1

  ?[question_2]{"category":[]}[who are you]=[] {1,2}
  [] OPTION 1
  [] OPTION 2
  [] OPTION 3

  this is paragraph line3

  ?[question_3]{"category":[]}[picode]=_ [PLACEHOLDER_TEXT]

  ?[question_1]{"category":[]}[sex]=() {1}
  () male 
  () femele 


  this is paragraph line3

是否所有问题类型都必须以?[一些文字],所以我可以使用这个正则表达式

收音机 -> [\?] ?[([0-9a-z_]。?)]({(?:[^{}]|?)})? ?[?(。?)]? ?[=] ?() ?({[0-9,]+})?([^]?)(\n\n|^\n)

复选框 -> [\?] ?[([0-9a-z_]。?)]({(?:[^{}]|?)})? ?[?(。?)]? ?[=] ?[] ?({[0-9,]+})?([^]?)(\n\n|^\n),

与所有输入类似,我的问题是如何获取段落行文本(那些不是以?[] 开头的,可能包含小写字母/大写字母/数字)

【问题讨论】:

  • 每当您提供示例时,显示作为所需结果的对象通常是有帮助的,即使您认为它是显而易见的。在这里,这将有助于读者理解您的问题。

标签: javascript python reactjs ruby-on-rails regex


【解决方案1】:

你可以这样做:

^(?!(?)|([)).+(
|$)

^ 会让你成为该行的开头,(?! 会向前看 ? 或 [ 字符,.+ 会匹配其余字符,直到 (换行符)或 $(文件结尾)。

regex101 demo

编辑

要对段落中的所有行进行分组,请尝试以下操作:

^((?!(?)|([))(.+(
|$)))+

regex101 demo

【讨论】:

  • 而不是关闭搜索的新行,我如何分组直到下一个匹配?[
  • 所以如果输入 3 行换行给我 3 个单独的匹配项,那么你的代码是这样的,但是现在,我想将它包装到一个组中,直到下一个匹配项?[
  • 不确定您是否还想将带有答案的行与 ( 匹配,但可以这样尝试:^((?!(?)|([))(.+( |$)))+demo
【解决方案2】:

以下是处理弦线检测时的一些关键想法。

  • 一些操作系统和浏览器使用不同的行尾。 (不只是 。有时是
  • ^ 不告诉行的开头。它告诉整个字符串的开始。

使用普通的.split()。 + 正则表达式在这种情况下效果很好。这是我在 SO 上找到的一个很好的例子。

https://stackoverflow.com/questions/21895233/how-to-split-string-with-newline-n-in-node
function splitLines(t) { return t.split(/
|
|
/); }

const lines = splitLines(yourString).forEach(line => radioOrCheckBoxRegex(line));

Markdown 很难(危险)

很抱歉偏离正则表达式,但我建议你不要从头开始实施降价.你会有无穷无尽的极端案例。因为

  • 如果它接受用户输入,则需要一定程度的净化。
  • 用户的期望总是与您的期望不同。他们会将如此多的奇怪字符串放入 markdown 中,并期望您的代码能够正常工作。在这种情况下,经过实战检验的降价库会派上用场。
  • 自定义 markdown 库可以教你 markdown 解析过程。
  • markdown 也是一个文档化的复杂标准。在实际开始实施之前遵循现有的降价规则。你在关注Github markdown rules吗?或者你在关注Commonmark rules?或者别的什么?并且用户也会希望您的应用程序遵守这些规则中的任何一条。

通过marked.js 等经典降价库实现自定义降价可能是一个更好的主意。大多数降价库使用内部标记器,它处理您提到的正则表达式。纯文本通过标记器变成程序可识别的数据(json,javascript obj)。可以只使用内部标记器,与实际渲染器分开。

检查这个lexer(tokenizer) code of marked.js

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2023-03-08
    • 2010-09-12
    • 2018-10-13
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多