React native:如何避免双重特殊字符?

React native: how to avoid double special characters?

我有一个代表一些标题的文本输入。允许使用字母和数字。以及 一些 特殊字符。例如:

"Don't use" -> valid sequence
"Don''t use" -> invalid sequence
"Don'?!%^t use" -> invalid sequence
"Be quiet!" -> valid sequence
"Be quiet!><" -> invalid sequence
"123 Your name?" -> valid sequence
"123 Your name?;'" -> invalid sequence

也就是说,如果文本输入包含字母、数字和 ONE 个字符 '?! 我认为我的文本输入是有效的。如果文本输入包含来自其他特殊字符的 any OR 连续两个来自允许的特殊字符,我认为它是无效的。

我的正则表达式应该是什么?

我在想我应该做两个测试。例如:

var notAllowedCharacters = /[ `@#$%^&*()_+\-=\[\]{};:"\|,.<>\/~]/;
if (notAllowedCharacters.test(text)) {
      //do somethin
    }

然后再测试:

var alowedCharacters = /[ `'?!]/;
    //how do I test if these characers are allowed to be used only surrounded by letters?
    if (alowedCharacters.test(text)) {
      //do something
    }

欢迎提出任何想法!

如果在“单词”之间只能出现所列字符中的 1 个,并且可以选择除末尾 space 以外的字符:

^\w+(?:[ `'?!]\w+)*[`.?!]?$

说明

  • ^ 字符串开头
  • \w+匹配1+个单词字符
  • (?:[ `'?!]\w+)*可选择重复列出的字符中的 1 个,然后再重复 1 个以上的单词字符,这样就不会出现 2 个相邻的字符。
  • [`.?!]? 可选择匹配列出的字符中的 1 个
  • $ 字符串结束

Regex demo

const regex = /^\w+(?:[ `'?!]\w+)*[`.?!]?$/;
[
  "Don't use",
  "Don''t use",
  "Don'?!%^t use",
  "Be quiet!",
  "Be quiet!><",
  "123 Your name?",
  "123 Your name?;'"
].forEach(s => console.log(`${s} --> ${regex.test(s)}`));