我想在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
感谢您的帮助
答案 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>