当前位置: 首页 > 知识库问答 >
问题:

REGEX使用任何单个字符的JSON样式字符串

子车飞鹏
2023-03-14

需要验证的字符串采用以下格式,严格来说它不是JSON,不能使用PHP的JSON编码过程进行验证。请注意,键中的%%是必需的。

// As a single pair
{"%%key%%":"value"}

// Or comma delimited pairs
{"%%key%%":"value","%%key 2%%":"value 2", ...etc...}

当前正则表达式成功验证了上述内容:

\{"%%[a-zA-Z0-9]+%%":"[a-zA-Z0-9 ]+"(?:,"%%[a-zA-Z0-9]+%%":"[a-zA-Z0-9 ]+")*}

有效示例:https://regex101.com/r/4y1uEu/1

无效示例(第二个值周围没有引号):https://regex101.com/r/4y1uEu/2

值需要支持其他字符,最好是任何字符,所以我将REGEX更改为

\{"%%[a-zA-Z0-9]+%%":".+"(?:,"%%[a-zA-Z0-9]+%%":".+")*}

与此字符串不匹配所需模式的匹配:

{"%%hello%%":"world","%%foo%%":bar"}
                              ^ missing quote

假阳性示例:https://regex101.com/r/4y1uEu/3

我相信原因是新的“任何角色”被用于整个部分:{ " % hello % % ":" world "," %foo%%":bar"}

我怎样才能以某种方式使“任何字符”匹配结束?这种方法会因为引号本身是“任意字符”而注定失败吗?

预期结果的一些例子:

< code > { " % hello % % ":" world "," %foo%%":"bar"}有效

{"%%hello%%":"world lorem","%%foo%%":"bar ipsum"}有效

{“%%hello%%”:“world lo-rem”,“%%foo%%”:“bar ips'um”}有效

{“%%hello%%”:“world lo-rem”,“%%foo%%”:“lorem ”ipsum“ dolor”}有效

共有1个答案

叶衡虑
2023-03-14
var pattern = /^{("%%[a-zA-Z0-9]+%%":"([A-z0-9\s\\"'-])*"\s*(,|})\s*)*$/
str = "{\"%%hello%%\":\"world lo-rem\",\"%%foo%%\":\"lorem \"ipsum\" dolor\"}"
console.log(str+ ' '+pattern.test(str))
str = "{\"%%hello%%\":\"world lo-rem\",\"%%foo%%\":\"bar ips'um\"}"
console.log(str+ ' '+pattern.test(str))
str = "{\"%%hello%%\":\"world\",\"%%foo%%\":bar\"}"
console.log(str+ ' '+pattern.test(str))
str = "{\"%%hello%%\":\"world\",\"%%foo%%\":bar}"
console.log(str+ ' '+pattern.test(str))
 类似资料:
  • 我已经做了一个有效的解决方案,但它很无聊,也很不优雅: 如何使用Regex实现这一点?

  • 问题内容: 我想,以取代所有和使用 但我不喜欢我的代码… 有没有比以下方法更有效的方法: ? toLowerCase()就在那里,因为我也希望它也小写… 问题答案: 编辑: 使用正则表达式,并且在字符类内部使用仅识别一个而不是任何字符。

  • 问题内容: 我以为可能是[。\ n] +,但这似乎不起作用? 问题答案: 点不能在字符类中使用。 请参阅选项Pattern.DOTALL。 启用dotall模式。在dotall模式下,表达式匹配任何字符,包括行终止符。默认情况下,此表达式与行终止符不匹配。也可以通过嵌入式标志表达式启用Dotall模式。(s是“单行”模式的助记符,在Perl中被称为。) 如果仅在正则表达式的一部分上需要它,则使用e

  • 被删除,因此也是另一个匹配字符串的一部分,不确定这是由于错误的regEx还是反字符类的错误应用。

  • 我有这些线。我希望有一个正则表达式来匹配它们,并在将它们传递给preg_match函数时返回true。 如何在正则表达式中创建与上述模式匹配的模式?像这样: 星号(*)表示任何单词。这是我目前掌握的正则表达式模式: 格式在单词上不匹配。如何在单词上匹配字符串?

  • 问题内容: 我有一个使用UTF-8字符串输出文本表的程序,并且我需要测量字符串使用的等宽字符单元数,以便正确对齐它。如果可能的话,我想使用标准功能。 问题答案: 来自Unix / Linux的UTF-8和Unicode常见问题解答 : 可以使用C以可移植的方式在C中计算字符数。只要已选择适当的语言环境,此方法就可以与其他支持的编码一样适用于UTF-8。计算UTF-8字符串中字符数的一种硬连接技术是