Javascript 在js中创建正确的regexp模式

Javascript 在js中创建正确的regexp模式,javascript,regex,Javascript,Regex,我希望在regexp上实现此模式,但我无法成功地使其按我所希望的方式工作 var strInput = $("#inputFilter").val(); var pattern = new RegExp("(#[a-z0-9]{3,})|(@[a-zA-Z0-9]{6,16})|([a-zA-Z0-9]{6,16})(,((#[a-z0-9]{3,})|(@[a-zA-Z0-9]{6,16})|([a-zA-Z0-9]{6,16})))*"); var result = pattern.test

我希望在regexp上实现此模式,但我无法成功地使其按我所希望的方式工作

var strInput = $("#inputFilter").val();
var pattern = new RegExp("(#[a-z0-9]{3,})|(@[a-zA-Z0-9]{6,16})|([a-zA-Z0-9]{6,16})(,((#[a-z0-9]{3,})|(@[a-zA-Z0-9]{6,16})|([a-zA-Z0-9]{6,16})))*");
var result = pattern.test(strInput);
if (!result)
{
    alert("Must follow this pattern, order is not relevant, e.g Title,#tag,@Username   or   Title,#tag,@Username,#tag2");
    return
}

Title与模式[a-zA-Z0-9]{6,16}匹配,因此在本例中,与模式匹配的是单词HelloWorld

#标记由模式#[a-z0-9]{3,}匹配,因此在本例中,与模式匹配的是单词#hello

@用户名由模式@[a-zA-Z0-9]{6,16}匹配,因此在本例中,与模式匹配的是单词@MyUser

我想要实现的是获得如下输入的匹配:

var regex = /^(#[a-zA-Z0-9]{3,}|@?[a-zA-Z0-9]{6,16})(,(#[a-zA-Z0-9]{3,}|@?[a-zA-Z0-9]{6,16}))*$/;
HelloWorld、#tag1、#tag2、#tag3、@MyUsername、#onemoretag、#等等

但是顺序并不重要,所以像这样的东西也可以

#tag1、#tag2、#tag3、@MyUsername、#tag4、HelloWorld



感谢您的帮助

这是一个非常简单的正则表达式,它与您提供的第一个示例相匹配,但在后面的一些示例中失败了:

^([#@]?[a-zA-Z0-9]+)(,([#@]?[a-zA-Z0-9]+))*$
它并不特别复杂,但为了便于阅读,我们将其细分:

  • ^$-这些字符“锚定”正则表达式:它们确保它不能匹配字符串中间的任何“浮动”部分,但必须匹配整个字符串

  • [#@]?
    [a-zA-Z0-9]+
    这两部分构成正则表达式的“肉”:第一部分匹配
    @
    或无,第二部分匹配其后的一个或多个字母数字字符

  • (…)(,(…)*
    匹配某个内容,后跟零个或多个相同内容,以逗号分隔


现在,从您的原始示例(以及添加的示例)来看,您希望为每个“单词”匹配专门的形式,而不仅仅是任何字母数字字符。这并不太难:您只需将所需的片段与
字符混合在一起,而不是
[#@]?[a-zA-Z0-9]+
。看起来这些是您想要的基本部件:

  • #[a-zA-Z0-9]{3,}
    -一个标签,三个或更多字母数字字符,前面加一个
    #

  • [a-zA-Z0-9]{6,16}
    -标题,介于六到十六个字母数字字符之间

  • @[a-zA-Z0-9]{6,16}
    -用户名,类似于标题,但前面有一个
    @
    符号

由于标题和用户名几乎相同,您只需将
@
设置为可选,组合的三种形式如下所示:
#[a-zA-Z0-9]{3,}|@?[a-zA-Z0-9]{6,16}

因此,替换中的代码,生成的代码如下所示:

var regex = /^(#[a-zA-Z0-9]{3,}|@?[a-zA-Z0-9]{6,16})(,(#[a-zA-Z0-9]{3,}|@?[a-zA-Z0-9]{6,16}))*$/;
不太难


下面附上一个演示程序,以说明它的工作原理

var regex=/^(#[a-zA-Z0-9]{3,}|@[a-zA-Z0-9]{6,16})(,(#[a-zA-Z0-9]{3,}|@[a-zA-Z0-9]{6,16}))*$/;
$(“.text”)。在(“键控”,函数()上{
var isMatch=regex.test(该值);
$(.match”).text(isMatch?“match”:“不匹配”);
});


什么东西应该和什么东西不应该匹配并不完全清楚;编写正则表达式很容易,但我真的不知道你想要它做什么。您的错误消息指出必须首先出现
标题
,但您的示例中没有提供该表单。逗号分隔的部分是否允许以任何顺序出现?是否有一个最低或最高限额,其中许多是允许的?我添加了一些更多的信息,让你更清楚