在js中制作正确的正则表达式模式

时间:2017-06-16 16:49:15

标签: 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(strInput);
if (!result)
{
    alert("Must follow this pattern, order is not relevant, e.g Title,#tag,@Username   or   Title,#tag,@Username,#tag2");
    return
}

标题与模式[a-zA-Z0-9] {6,16}匹配,因此对于这个例子,它将是与模式匹配的单词HelloWorld

#tag与模式#[a-z0-9] {3,}相匹配所以对于这个例子,它将是#hello,它与模式匹配

@Username与模式@ [a-zA-Z0-9] {6,16}匹配,所以对于这个例子,它将是@MyUser,它与模式匹配

我想要达到的是获得如下输入的匹配:

  

的HelloWorld,#TAG1,TAG2#,#TAG3,@名为myUsername,#onemoretag,#andonemore

但顺序并不重要,所以这样的事情也会很好

  

#TAG1,TAG2#,#TAG3,@名为myUsername,#TAG4,HelloWorld的

should match:
#hello
HelloWorld
@username
#hello,@MyUser,HelloWorld
@MyUsername,HiWorld,#hello1,#hello2

should NOT match:
#@hello
#hi
@User
@Username#hello

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

所以这是一个更简单的正则表达式,与你提供的第一个示例相匹配,但在后来的一些示例中失败了:

^([#@]?[a-zA-Z0-9]+)(,([#@]?[a-zA-Z0-9]+))*$

这并不是特别复杂,但为了便于阅读,我们将其细分:

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

  • [#@]? [a-zA-Z0-9]+这两个部分组成了正则表达式的“肉”:第一个匹配#@或者没有,第二个匹配一个或更多的字母数字字符。

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

现在,从原始示例(以及您添加的示例)中可以看出,您希望匹配每个“单词”的专用表单,而不仅仅是任何字母数字字符。这并不太难:您只需将[#@]?[a-zA-Z0-9]+个字符拼接在一起,而不是|。所以看起来这些是你想要的基础部分:

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

  • [a-zA-Z0-9]{6,16} - 一个标题,介于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").on("keyup", function() {
    var isMatch = regex.test(this.value);
    $(".match").text(isMatch ? "match" : "not match");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="text" />

<div class="match"></div>