【问题标题】:JavaScript RegEx - Minimum characters with WildcardJavaScript RegEx - 带通配符的最少字符数
【发布时间】:2016-04-26 19:55:23
【问题描述】:

我正在匹配通配符搜索输入。这是一个名称字段。 以下是我需要匹配的条件。

  1. 如果用户选择进行通配符搜索,他必须输入至少 3 个字母数字字符
  2. 用户可以/不可以在字符串的开头或结尾输入通配符,但可以在任一侧。
  3. 单词之间允许有空格。

我想提一下,我在进行匹配之前会修剪字符串。这是我到目前为止所尝试的。

^[^\W_](\s?\w?)*$|^[^\W_]{3,}(\s?\w?)*\*$|^[\*][^\W_]{3,}(\s?\w?)*$

Debuggex Demo

以下是我尝试过的一些示例 -

  • 某人 xxx,某人 xxx yyy - 通过
  • 某人* xxx- 失败
  • 某人,某人 - 通过

这是我想要的最接近的匹配项 - 但这些测试用例失败了。

  • AB asf* -- 失败,这将通过- ABC asf*

  • *AB asf -- 失败,这将通过- *ABC asf

我知道我的条件是 - 以至少 3 个字母数字字符开头并重复空格和字母数字字符。

这就是我需要帮助的地方。

谢谢。

【问题讨论】:

  • 为什么是正则表达式?验证功能在这里应该没问题
  • 正则表达式可以成为这些情况的干净解决方案,我向他们学习,stackoverflow 社区总是在那里寻求帮助。
  • - ccf - 我将您的答案标记为正确答案。抱歉,如果问题中有一些混淆。我将编辑我的问题以添加匹配和不匹配场景。

标签: javascript regex


【解决方案1】:

UPDATE2这种模式应该这样做:

/^([a-zA-Z0-9]{3,}[^\n*]*\*?|\*[a-zA-Z0-9]{2,}[^\n*]*|[a-zA-Z0-9]{2}\*)$/gm

解释:

^                               # assert start of line
 (                              # 1st capturing group starts         
    [a-zA-Z0-9]{3,}             # match 3+ times alphanumeric characters
                  [^\n*]*       # match 0 or more non-newline and non-star (*) characters
                         \*?    # match 0 or one literal star (*) character;
  |                             # OR
    \*                          # match one literal star (*) character
      [a-zA-Z0-9]{2,}           # match 2+ times alphanumeric characters
                     [^\n*]*    # match 0 or more non-newline and non-star (*) characters;
  |                             # OR
    [a-zA-Z0-9]{2}              # match 2 non-newline and non-star (*) characters
                  \*            # match one literal star (*) character
 )                              # 1st capturing group ends       
$                               # assert end of line

REGEX 101 DEMO.

【讨论】:

  • AB asf* 这是我需要匹配的,因为总共有 3 个字符。
  • 但条件是,starts with at least 3 alphanumeric character。所以,你的意思是,它还包括空间?另外,具体来说,你想要AB asf* -- Fails,对吗?
  • 抱歉问题中的任何混淆,如果用户选择输入通配符,则字符数应至少为 3。因此 AJ S* 是一个很好的例子。 AB asf* 这也是我的正则表达式失败的原因,我想通过这种情况。
  • 谢谢,看来我们已经很接近了,仍然 fd c* - 匹配 *fd c - 不匹配
  • 这些应该会失败,因为如果用户选择使用通配符搜索,他必须输入至少 3 个字符。 99* *99 *9g *fd
【解决方案2】:

试试这个:

^(?:[^\W_]+|\*[^\W_]{3,}|[^\W_]{3,}\*)(?:\s+(?:[^\W_]+|\*[^\W_]{3,}|[^\W_]{3,}\*))*$

注意:使用 [^\W_] 而不是 \w 就像在原始正则表达式中一样。

regex101

但是,我认为使用正则表达式无法以干净的方式解决此任务。也许一个合适的 javascript 函数会更具可读性。

【讨论】:

    【解决方案3】:

    如果我理解正确的要求,
    这可能有效。在我的测试中确实如此。

    ^(?:\*[^\W_]{3,}(?:\s*[^\W_]\s*)*|(?:\s*[^\W_]\s*)*[^\W_]{3,}\*|(?:\s*[^\W_]\s*)+)$

    展开

     ^                             # BOS
     (?:                           # One of either ---
          \*                            # Star at beeginning
          [^\W_]{3,}                    # 3 or more words
          (?: \s* [^\W_] \s* )*         # Any number of word's following spaces
       |                              # or,
          (?: \s* [^\W_] \s* )*         # Any number of word's following spaces
          [^\W_]{3,}                    # 3 or more words
          \*                            # Star at end
       |                              # or, 
          (?: \s* [^\W_] \s* )+         # Any number of word's following spaces
     )                             # ---------
     $                             # EOS 
    

    【讨论】:

    • 这没有通过 *AB Cdcv,对于用户来说,如果他输入 AJ S'asteric 是一个有效的条目,因为这是 3 个字符
    • @Lucky - 你的格式正确吗?此 *AB Cdcv 不(也不应该?)匹配,AJ S 与此正则表达式匹配。
    • 我认为它没有被格式化。我想通过这个场景。 AB Cdcv,我也举了一个例子来说明,如果用户输入应该匹配的 AJ S
    • 对不起,它没有显示星号,是的,我想通过它。 AJ Sasterisk 也应该通过。谢谢
    • 星号* 是一个格式化字符。使用反引号突出显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2018-08-17
    • 1970-01-01
    • 2019-02-13
    • 2019-09-23
    相关资源
    最近更新 更多