regex 从段落中查找整行的正则表达式

slsn1g29  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(145)

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

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

所有的问题类型都必须以开头吗?[sometext],这样我就可以使用这个正则表达式了
单选-〉[\?]?[([0-9a-z_].?)]({(?:[^{}]|?)})??[?(.*?)]??[=]?()?({[0-9,]+})?([^]?)(\n\n|^\n)
复选框-〉[\?]?[([0-9a-z_].
?)]({(?:[^{}]|?)})??[?(.*?)]??[=]?[]?({[0-9,]+})?([^]?)(\n\n|^\n),
与所有输入类似,我的问题是如何获得段落行文本(这些不是开头?[],其中可能包含小/大写/数字)

9lowa7mx

9lowa7mx1#

你可以这样做:

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

^将显示行首,(?!将向前查找?或[字符,.+将匹配其余字符,直到\n(换行符)或$(文件结尾)。
regex101 demo

    • 编辑**

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

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

regex101 demo

kxkpmulp

kxkpmulp2#

以下是处理字符串检测时的一些关键思想。

  • 一些操作系统和浏览器使用不同行结束符。(不只是\n,有时候是\r\r\n
  • ^不告诉行的开始。它告诉整个字符串的开始。

使用普通的.split()。+ regex在这种情况下工作得很好。下面是我在SO上找到的一个很好的例子。

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

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

降价难(危险)

对不起,偏离正则表达式,但我建议你不要实现零折扣。你会有无数的极端情况。因为

  • 如果它接受用户输入,则需要某种程度的净化。
  • 用户的期望总是与你的期望不同.他们会把这么多奇怪的字符串放到markdown中并期望你的代码能工作. battle-tested markdown libs在这种情况下会派上用场.
  • 定制markdown库可以教你markdown解析过程。
  • 降价也是一个记录在案的复杂标准。在实际开始实施降价规则之前,请遵循现有的降价规则。您遵循的是Github markdown rules吗?还是Commonmark rules?还是其他规则?用户也希望您的应用遵循其中的任何规则。

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

相关问题