【问题标题】:I have a problem with string.match(part) (javascript)我对 string.match(part) (javascript) 有疑问
【发布时间】:2010-09-03 11:26:52
【问题描述】:
var string = $.trim("How are you ? are you fine ?");
var part = $.trim("How are you ? are you fine ?");
var SearchResult = string.match(part);
if (SearchResult != null && part!="") {
alert("hello1");
}
string = $.trim("How are you ? a");
part = $.trim("How are you ? a");
SearchResult = string.match(part);
if (SearchResult != null && part!="") {
alert("hello2");
}
string = $.trim("How are you ?");
part = $.trim("How are you ?");
SearchResult = string.match(part);
if (SearchResult != null && part!="") {
alert("hello3");
}
只有第三个警报有效;第一个和第二个字符串有什么问题?
【问题讨论】:
标签:
javascript
regex
match
【解决方案1】:
我认为问题在于字符串中有一个问号,它被解析为特殊的正则表达式字符。您应该尝试将其转义为 \? 。
【解决方案2】:
当match被一个非RegExp对象调用时,它被转换为一个RegExp:
如果传递了非正则表达式对象obj,则使用new RegExp(obj) 将其隐式转换为正则表达式。
这意味着由于? 是正则表达式中的特殊字符(意味着前面的表达式可能重复零次或一次),您需要使用\? 对其进行转义。由于\ 也需要在字符串声明中进行转义,因此您需要:
var part = $.trim("How are you \\? are you fine \\?");
更简单的方法是使用 indexOf 返回匹配开始的索引,如果没有匹配则使用 -1:
string.indexOf(part) > -1
【解决方案3】:
应该是:
part = $.trim("How are you \\? a")
【解决方案4】:
实际上,前两个警报工作正常;第三个只是偶然匹配。如果您打印匹配结果,您会看到末尾没有问号。正如其他响应者所说,? 是metacharacter,所以/How are you ?/ 匹配序列“你好吗”,可以选择后跟一个空格。
正如其他人所说,如果要匹配文字问号,则必须对其进行转义。如果你想强制正则表达式匹配整个字符串或什么都不匹配,你需要在两端锚定它:
/^How are you \?$/