Javascript 如何完成regex语句以验证首字母

Javascript 如何完成regex语句以验证首字母,javascript,regex,Javascript,Regex,我希望使用正则表达式只验证首字母。首字母必须遵循以下格式: 首字母只能是大写字母 每个字母后面都必须有一个句号 每个字母周期对只能由1个空格分隔 幸运的是,前导空格和尾随空格都没有问题 我能够捕获大写字母句点对,但我很难阻止它接受小写字母,并且中间只有一个空格 var pattern = /[A-Z\s]+(.)/gi; 我希望在对“H.p.”这样的字符串进行测试时,它会返回true。当针对诸如“H.p.”、“H.p”之类的字符串进行测试时,它将返回false”,让我们看看您的需求,找出与每个

我希望使用正则表达式只验证首字母。首字母必须遵循以下格式:

  • 首字母只能是大写字母
  • 每个字母后面都必须有一个句号
  • 每个字母周期对只能由1个空格分隔
  • 幸运的是,前导空格和尾随空格都没有问题
  • 我能够捕获大写字母句点对,但我很难阻止它接受小写字母,并且中间只有一个空格

    var pattern = /[A-Z\s]+(.)/gi;
    

    我希望在对“
    H.p.
    ”这样的字符串进行测试时,它会返回
    true
    。当针对诸如“
    H.p.
    ”、“
    H.p
    ”之类的字符串进行测试时,它将返回
    false

    ”,让我们看看您的需求,找出与每个部分匹配的模式。没有特别的顺序

  • 前导空格和尾随空格都可以

    这很简单,只需将
    \s*
    添加到开始(
    ^
    )和结束(
    $
    )锚点

    /^\s*..\s*$/
    
  • 首字母只能用大写字母

    具有大写字母的字符类满足此要求

    /[A-Z]/
    
  • 每个字母后面都必须有一个句号

    向上一个模式添加文字句点

    /[A-Z]\/
    
  • 为了将所有这些结合起来,我将做出以下假设

  • 必须至少有一个首字母(大写字母和句点)
  • 首字母必须用单个空格字符分隔
  • 这将导致以下模式

    /^\s*[A-Z]\.([A-Z]\.)*\s*$/
    
    坏了,这是

    /
    ^\s*#字符串开头有零个或多个空格
    [A-Z]\.\大写字母后跟句号
    ([A-Z]\)*#零次或多次重复空格+字母+句点
    \s*$#字符串末尾有零个或多个空格
    /
    
    const rx=/^\s*[A-Z]\.([A-Z]\.)*\s*$/
    常量测试=[“H.”、“H.”、“H.”、“H.P.”、“H.P.”、“H.P.”、“H.P.”、“H.P.L.”]
    tests.forEach(str=>
    
    console.info(str,'=',rx.test(str))
    此表达式可能工作正常:

    ^\s*[A-Z]\.\s[A-Z]\.\s*$
    
    或者,如果您有两个以上的字母要求,我们会添加一个具有上下界的量词:

    ^\s*[A-Z]\.(?:\s[A-Z]\.){1,2}\s*$
    
    我们还可以继续限制空间的数量:

    ^\s{0,4}[A-Z]\.(?:\s[A-Z]\.){1,2}\s{0,3}$
    
    const regex=/^\s*[A-Z]\.(?:\s[A-Z]\.){1,2}\s*$/gm;
    const str=`H.P。
    惠普。
    惠普。
    香港。
    H.P.K.M。
    惠普。
    H.P`;
    让m;
    while((m=regex.exec(str))!==null){
    if(m.index==regex.lastIndex){
    regex.lastIndex++;
    }
    m、 forEach((匹配,组索引)=>{
    log(`Found match,group${groupIndex}:${match}`);
    });
    
    }
    您提到的最直接的问题(不要接受小写)是因为您的模式上有一个
    i
    标志,这使得它不区分大小写“每个字母-句点对只能由一个空格分隔”。您还需要转义点(使用
    \。
    而不是
    )因为
    表示匹配任何内容,而
    \。
    表示匹配文字点。很好,希望我想到使用非捕获组。将重复的首字母限制为2的原因是什么?