我正在尝试创建一堆YAML文件,这些文件主要由文本字符串组成。现在,当在单词中使用撇号时,必须键入双撇号来转义它们,因为我正在使用撇号来包装字符串。
我想创建一个正则表达式,以检查文本中没有加倍的撇号。我有这个:
^([^'\n]*?)'(([^'\n]*?)'(?!')([^'\n]+?))*?'$\n
https://regex101.com/r/v4nUTn/3
我的问题是,当我的字符串中有双撇号但又有一个不是双撇号的撇号时,它就不匹配,因为我的否定前瞻在看到双撇号后就不匹配撇号。 (例如,即使字符串t''e'st
在e
之后缺少双撇号也不会匹配)
如何做到这一点,以使我的否定前瞻一旦看到一个双撇号就不会失败?
答案 0 :(得分:0)
答案 1 :(得分:0)
我的猜测是,也许类似
的表达式('[^'\r\n]*'|[^\r\n\w']+)|([\w']*)
可以作为一种选择。
如果第二个捕获组返回true,则不希望使用该字符串。
如果您想探索/简化/修改表达式,可以 在右上角的面板上进行了说明 regex101.com。如果您愿意, 也可以在this link中观看它的匹配方式 针对一些样本输入。
答案 2 :(得分:0)
一个建议是分两个步骤进行。
例如,如果每个“候选”值看起来都像这样:- 'something here'
(要在字符串的something here
内容中测试撇号,则首先通过以下方式隔离该内容:< / p>
/^\s*- '(.+)'$/im
然后确保所有撇号都出现在您希望它们出现在结果的匹配组1中的位置。
然后,将原始匹配替换为“经过消毒的”匹配。
这样做意味着您不必担心边界撇号会导致检查值中的撇号复杂化。
注意:很可能会有一个完美的单步正则表达式来执行此操作,但是如果您花大量时间使用正则表达式,则可以将任务分解为多个步骤很有用,并且可以帮助您避开“完美的正则表达式”瘫痪”。
答案 3 :(得分:0)
如果您希望在单引号字符串之间存在至少一个“单引号”的情况下匹配字符串,那么您应该允许使用其中不包含任何单引号的字符串,或者允许使用包含两个单引号的字符串然后应该对正则表达式进行一些修改以使用两个单引号,并在正则表达式中添加|''
,这将使用非单引号文本或具有至少两个单引号的部分。
尝试此更新的正则表达式演示,看看它是否如您所愿?