我有一个无法正常工作的标准表达式。 该表达式应该捕获字符串中任何位置是否包含无效字符。它在 RegExr.com 上运行得很好,但在我的测试中却不是。
表达式为:/[a-zA-Z0-9'.\-]/g
失败:@#@#
但通过:aa@#@#
两次都应该失败,我做错了什么?
此外,/^[a-zA-Z0-9'.\-]$/g
不匹配任何内容...
//All Boxs
$('input[type="text"]').each(function () {
var text = $(this).prop("value")
var textTest = /[a-zA-Z0-9'.\-]/g.test(text)
if (!textTest && text != "") {
allFieldsValid = false
$(this).css("background-color", "rgba(224, 0, 0, 0.29)")
alert("Invalid characters found in " + text + " \n\n Valid characters are:\n A-Z a-z 0-9 ' . -")
}
else {
$(this).css("background-color", "#FFFFFF")
$(this).prop("value", text)
}
});
编辑:添加代码
最佳答案
问题重新标记后更新
您需要使用
var textTest = /^[a-zA-Z0-9'.-]+$/.test(text)
^^
请注意缺少 /g
修饰符和 +
量词。有known issues当您在 RegExp#test()
函数中使用的正则表达式中使用 /g
全局修饰符时。
您可以借助 /i
不区分大小写修饰符将其缩短一点:
var textTest = /^[A-Z0-9'.-]+$/i.test(text)
此外,正如我在下面提到的,您不必转义字符类 [...]
末尾的 -
,但建议如果稍后不太精通正则表达式的开发人员会修改模式,请保持转义。
原始 C# 相关详细信息
好吧,假设您正在使用 Regex.IsMatch(str, @"[a-zA-Z0-9'.-]")
。 Regex.IsMatch
搜索字符串内的部分匹配。因此,如果输入字符串包含 ASCII 字母、数字、'
、.
或 -
,则会通过。因此,aa@#@#
通过此测试是合乎逻辑的,而 @#@#
则没有。
如果您使用第二个作为 Regex.IsMatch(str, @"^[a-zA-Z0-9'.-]$")
,则只有 1 个字符串(带有可选的末尾的换行符)将被匹配为 ^
匹配字符串的开头,[a-zA-Z0-9'.-]
匹配指定的 1 个字符范围/集合,并且 $
匹配字符串的末尾(或最后一个换行符之前)。
因此,您需要一个量词(+
匹配 1 个或多个,或 *
匹配零个或多个出现)和 anchor \A
和 \z
:
Regex.IsMatch(str, @"\A[a-zA-Z0-9'.-]+\z")
^^ ^^^
在 .NET 中,\A
匹配字符串的开头(始终),\z
匹配字符串的最末尾。 [a-zA-Z0-9'.-]+
将匹配 1 个以上字符,这些字符可以是 ASCII 字母、数字、'
、.
或 -
。
请注意,字符类末尾的 -
不必转义(但如果其他开发人员必须修改模式稍后)。
请小心测试正则表达式的位置。 Regexr 仅支持 JavaScript 正则表达式语法。要测试 .NET 正则表达式,请使用 RegexStorm.net或RegexHero .
关于javascript - 正则表达式,不读取整个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37866914/