【问题标题】:How to check string quotes in regex如何检查正则表达式中的字符串引号
【发布时间】:2017-08-21 09:09:18
【问题描述】:

在我的应用中,我可以接受这种格式的字符串:

'key':'value'
'key1':'value1'
'key2':'value2'

现在我想写一个正则表达式模式来检查这种格式,所以我写了这个模式:

/^'(.*)'(:{1})'(.*)?'($|\n)/gm

https://regex101.com/r/oM1qO9/3

此模式有效,但如果我将字符串更改为以下示例,则再次工作,因为选择第一个引号和最后一个引号,因此字符串与模式匹配。

'key':'value','key1':'value1' 'key2':'value2'

https://regex101.com/r/oM1qO9/4

【问题讨论】:

  • .* 替换为[^']*(否定字符类中的单引号)。 /^'([^']*)':'([^']*)'$/.
  • @WiktorStribiżew 不再工作,regex101.com/r/oM1qO9/5
  • 你可能想要一个非贪婪的消费:/^'(.*?)'(:{1})'(.*?)?'($|\n)/gm
  • {1} 没用,(.*)(.*)? 可能应该是 (.*?) 以迫使他们不要贪婪,但你的 regex 的真正问题是 ($|\n)。它强制regex 匹配整个字符串。
  • 添加 \s* 以在需要时允许空格。请查看我的 cmets 并相应地更新问题以使其更清晰。 regex101.com/r/oM1qO9/8 有效吗?

标签: regex


【解决方案1】:

.* 模式尽可能多地匹配除换行符之外的任何 0+ 字符:从当前位置到行尾,消耗它在到达行尾的途中找到的所有 ' 字符。即使您使用 .*? 模式,一个惰性量化点,它仍然会通过 ' 找到有效匹配项(一整行至少有 4 个 ' 字符)。

所以,你需要在这里使用否定字符类,[^'] 匹配除' 之外的任何字符。

/^'([^']*)':'([^']*)'$/

或者 - 禁止空键名:

/^'([^']+)':'([^']*)'$/

或者 - 禁止空名称和值:

/^'([^']+)':'([^']+)'$/

详情

  • ^ - 字符串开头
  • ' - 撇号
  • ([^']*) - 第 1 组:除 ' 之外的任何 0+ 个字符
  • ':' - 文字子字符串 ':'
  • ([^']*) - 第 2 组:除 ' 之外的任何 0+ 个字符
  • '$ - 字符串末尾的 '

请参阅regex demo

请注意,* 匹配 0 次或多次出现。如果您需要匹配至少一个,请改用+

要允许可选空格,请在需要的任何地方添加\s*。例如,您可以使用

/^\s*'([^']*)'\s*:\s*'([^']*)'\s*$/

this regex demo

【讨论】:

  • 为了匹配正则表达式,键和值都应至少包含 1 个字符。因此,您将 * 替换为 ' 的建议不应该是一个建议。 ;-) 否则 '':'' 匹配,这不是有效的键值对。
  • @mlambirichs:OP 没有设置名称或值应包含至少 1 个字符的要求。我刚刚修改了现有模式以展示如何确保字符串中只有 4 个单引号。
  • 你是对的,当然,他/她没有具体说明。但是人们最终将空字符串放入数据库中,我只是想警告一下。
  • @mlambichs 我回答了超过 13,000 个关于正则表达式的问题。我见过很多奇怪的要求。我不想多想(我被问过很多次)。如果您需要禁止空输入,请使用+ 而不是*
【解决方案2】:

使用'([^']+)'\s*:\s*'([^']*)':
首先它匹配一对 ' 之间不包含 ' 的任何非空字符串,然后匹配任意数量的空格、冒号和任意数量的空格,最后匹配一对之间不包含 ' 的另一个可能为空的字符串的 '。

我假设您只想捕获键和值,而不是冒号,因此我删除了该捕获组。

https://regex101.com/r/nxVAkB/3

【讨论】:

  • 谢谢,我想用这个模式进行验证而不是捕获字符串,所以如果一个词不匹配,所有模式都应该返回 false
【解决方案3】:

全局匹配

'(?<key>[^']+)':'(?<value>[^']+)'

匹配你所有的例子并给你-命名-结果。

查看regex101.com

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2016-08-20
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多