【问题标题】:Regex match only strings with every word capitalized, except for "in", "of"正则表达式仅匹配每个单词都大写的字符串,“in”、“of”除外
【发布时间】:2021-04-21 16:22:56
【问题描述】:

我正在尝试使用正则表达式 (javascript) 来匹配每个单词都大写的字符串,除了允许小写的几个单词(“in”、“of”)。

例子:

  1. 快速棕色狐狸跳跃 [通过]
  2. 敏捷的棕狐 跳跃 [失败]
  3. 快速的棕色狐狸跳跃 [失败]
  4. 快速棕色 Fox Jumps [通过]
  5. [PASS] 中的快速棕狐

我发现了一个正则表达式,我将它科学化为仅对大写单词部分进行“某种”工作:

^\b(?:[A-Z]\w+\b(?:\s*)?)+$

但是我不知道如何修改它以允许示例 #4 和 #5。

感谢任何帮助 - 我是第一个计时器!

【问题讨论】:

标签: javascript regex


【解决方案1】:

您可以使用您的模式,并且可以选择重复单词 chars 以防您还想匹配单个大写字符,并为您想要允许的小写单词使用交替。

然后您可以重复前面带有 1 个或多个空白字符的相同部分。

^(?:[A-Z]\w*|in|of)(?:\s+(?:[A-Z]\w*|in|of))*$

模式匹配:

  • ^ 字符串开始
  • (?:[A-Z]\w*|in|of) 匹配大写字符 A-Z 和可选单词字符
  • (?:非捕获组
    • \s+ 匹配 1+ 个空格字符
    • (?:[A-Z]\w*|in|of) 匹配大写字符 A-Z 和可选单词字符
  • )*关闭非捕获组并可选择重复
  • $ 字符串结束

Regex demo

const pattern = /^(?:[A-Z]\w*|in|of)(?:\s+(?:[A-Z]\w*|in|of))*$/;
[
  "The Quick Brown Fox Jumps",
  "The quick brown fox jumps",
  "The Quick brown Fox Jumps",
  "The Quick Brown of Fox Jumps",
  "The Quick Brown Fox in",
].forEach(s => console.log(pattern.test(s) ? `${s} [PASS]` : `${s} [FAIL]`));

【讨论】:

    【解决方案2】:

    正则表达式,并不是万能的解决方案,我认为在这种情况下最好写这样的东西:

    let sentences = [
      'The Quick Brown Fox Jumps',
      'The quick brown fox jumps',
      'The Quick brown Fox Jumps',
      'The Quick Brown of Fox Jumps',
      'The Quick Brown Fox in'
    ];
    
    const validateSentence = (sentence) => {
      let words = sentence.split(' ');
      return words.every(word => {
        return word[0] === word[0].toUpperCase()
        || ['in', 'of'].includes(word);
      });
    }
    
    sentences.forEach(sentence => {
        console.log(sentence, '=>', validateSentence(sentence));
    });

    【讨论】:

    • of The Quick Brown Fox 怎么样?
    • @georg,它也在工作,有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多