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

JavaScript正则表达式:捕获可选组,同时具有严格的匹配

司徒瀚
2023-03-14

我正在尝试从用户输入中提取一些应遵循以下格式的数据1d 5h 30m,这意味着用户输入的时间量为1天,5小时30分钟。

我正在尝试提取输入的每个部分的值。但是,每个组都是可选的,这意味着 2h 20m 是有效输入。

我试图在输入中保持灵活性(从某种意义上说,并非所有部分都需要输入),但与此同时,我不会看着我的正则表达式来匹配一些随机的插补,如asdfasdf20m。这个应该被拒绝(没有匹配项)。

因此,首先我去掉了用户可能使用过的任何分隔符(他们的输入可能看起来像< code>4h,10m,这没问题):

input = input.replace(/[\s.,;_|#-]+/g, '');

然后我捕获每个部分,我使用将其指示为可选?

var match = /^((\d+)d)?((\d+)h)?((\d+)m)?$/.exec(input);

当我只想要实际值时,捕获包括字母在内的整个组有点混乱,但如果不用括号括起来,我不能说集群是可选的,对吗?

然后,当捕获空组时,匹配中的值为未定义。是否有任何函数将<code>未定义的<code>值默认为特定值?例如,0在这里很方便。

一个例子,其中输入"4d,20h,55m"匹配结果是:

["4d20h55m", "4d", "4", "20h", "20", "55m", "55", index: 0, input: "4d20h55m"]

我的主要问题是:

>

  • 如何将组指示为可选组,但避免捕获它?

    如何处理可能匹配的输入,如abcdefg6d8m

    我如何处理更改的订单?例如,用户可以输入< code>20m 10h。

    当我问“如何处理x”时,我的意思是我希望能够拒绝那些匹配。

  • 共有1个答案

    司马作人
    2023-03-14

    作为变体:

    HTML:

    <input type="text">
    <button>Check</button>
    <div id="res"></div>
    

    JS:

    var r = [];
    document.querySelector('button').addEventListener('click', function(){
      var v = document.querySelector('input').value;
      v.replace(/(\d+d)|(\d+h)|(\d+m)/ig, replacer);
      document.querySelector('#res').innerText = r;
    }, false);
    
    function trim(s, mask) {
        while (~mask.indexOf(s[0])) {
            s = s.slice(1);
        }
        while (~mask.indexOf(s[s.length - 1])) {
            s = s.slice(0, -1);
        }
        return s;
    }
    
    function replacer(str){
      if(/d$/gi.test(str)){
        r[0] = str;
      }
      else if(/h$/gi.test(str)){
        r[1] = str;
      }
      else if(/m$/gi.test(str)){
        r[2] = str;
      }
      return trim(r.join(', '), ',');
    }
    

    看这里。

     类似资料:
    • 我有一个具有多个可选和非捕获组的正则表达式。所有这些组都可能发生,但不必发生。正则表达式应使用非捕获组返回整个字符串。 当我将最后一个组也设置为可选时,正则表达式将具有多个分组结果。当我将第一组设置为非可选时,正则表达式匹配。为什么? 输入将类似于,预期输出。 提前感谢!

    • 我是一个完全的正则表达式新手,花了几个小时试图解决这个难题。我认为我必须使用某种可选的非捕获组或交替。 我想匹配以下字符串: > 诺伊尔电影 a von 1000 诺伊尔电影a von 1000 mit b 诺伊尔电影a von 1000 mit b und c 1000英镑的新电影 诺伊尔电影公司 诺伊尔电影a mit b und c 诺伊尔电影a mit b und c und 我的正则表达式

    • 我正在分析的文本包括捕获组前后以及捕获组内的星号。我确定的解析捕获组的模式基本上是:文本前的连续星号总是至少为30。类似地,最后一个单词后面的连续星号长度至少为15个字符。捕获组中的连续星号始终小于10。我遇到的问题是,我不确定如何给捕获组中的星号和组中的其他字符赋予不同的量词,但将其包含在同一匹配集中。例如: 所以基本上,我只需要捕获文本部分。星号可以存在于实际文本之前和之后(我可以稍后删除),

    • 我试图写一个正则表达式来匹配三个组,在三个组中,我希望有一个组是可选的。 正则表达式: 它匹配以下内容: 但是,不是在下面。 如何修改正则表达式,使其匹配两个组。如果第一条消息是三个组。 修复 测试 消息 如果是第二条消息,只有两组 < li >修复 < li >消息 消息

    • 当所有组都是可选的时,我在提取组时遇到了问题。 上下文(如果您愿意,可以跳到结尾):这是在将字符串与一堆正则表达式进行最佳匹配并查看哪个表达式具有最多组匹配的上下文中。 例如,我可能有一个潜在的格式; 但我希望用户打错字,或者不包含空格或其他东西。 所以我可以用绳子测试一下 并希望获得组 一个 光盘 1-1 G 而且,对于测试字符串 我想得到   DE   克 下面是我的正则表达式,用于匹配以下可

    • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/