【问题标题】:JOI how to allow empty spaces and punctuationJOI如何允许空格和标点符号
【发布时间】:2019-08-08 21:12:55
【问题描述】:

我想允许 Joi 在表单的标题字段中允许空格/空格。

明天和裘德一起工作。

应该被允许

晨跑

此时只有最后一个被验证为真。这是我的 joi 验证:

const schema = Joi.object().keys({
  title: Joi.string().alphanum().required().max(50),

我添加了Regex,但没有结果。

title: Joi.string().alphanum().required().max(50), regex(
  new RegExp('^\w+( +\w+)*$'))

什么是正确的方法?

【问题讨论】:

  • 如果将new RegExp('^\w+( +\w+)*$') 替换为/^\w+( +\w+)*$/ 会怎样?
  • 仍然不允许空格
  • 可能需要去掉.alphanum()
  • 有效。现在只在正则表达式中添加标点符号。欢呼
  • 那么,你的意思是/^\w+(?:\W+\w+)*$/

标签: javascript node.js regex vue.js joi


【解决方案1】:

.alphanum() 使您的检查忽略空格。此外,当您使用构造函数表示法定义正则表达式时,您使用的是字符串文字,其中反斜杠用于形成字符串转义序列,因此需要加倍以形成正则表达式转义序列。但是,正则表达式文字表示法更方便。与其写new RegExp('\\d'),不如写/\d/

因此,您可以使用它来只允许空格:

title: Joi.string().required().max(50), regex(/^\w+(?:\s+\w+)*$/)

但是,您似乎不想允许使用逗号并允许使用所有其他标点符号。

使用

title: Joi.string().required().max(50), regex(/^\s*\w+(?:[^\w,]+\w+)*[^,\w]*$/)

详情

  • ^ - 字符串开头
  • \s* - 0 个或多个空格(或者,使用 [^,\w]* 匹配除逗号和单词字符之外的 0 个或多个字符)
  • \w+ - 1 个或多个单词字符(字母、数字或 _,如果您不想要 _,请替换为 [^\W_]
  • (?:[^\w,]+\w+)* - 零次或多次重复
    • [^\w,]+ - 1 个或多个除逗号和单词字符以外的字符
    • \w+ - 1 个或多个单词字符
  • [^,\w]* - 0 个或多个除逗号和单词字符以外的字符
  • $ - 字符串结束。

【讨论】:

  • 我们快到了。标点符号仍然不起作用。
  • @Tichel 你没有问过标点符号。您应该使用要匹配的标点符号更新问题。添加有效/无效案例。
  • @Tichel 那么,/^\w+(?:\W+\w+)*$/ 是否按预期工作?
  • @Tichel 我看到你也更新了这个例子。但是现在,我不太明白你的意图是什么:什么是不允许的?适合您的模式是/^\W*\w+(?:\W+\w+)*\W*$/,请参阅regex101.com/r/1Q2EcU/1。是否要禁止空字符串并匹配任何非空/非空字符串?
  • Wiktor,现在允许使用逗号 ( , )。点 ( . ) 不是。我正在努力。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 2019-06-01
  • 2020-12-17
  • 2017-07-11
  • 2018-01-12
  • 2015-09-12
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多