Javascript 使用引号和*
我试图编写一个正则表达式来验证用户输入的文本。我希望将正则表达式与指令一起使用,因此应避免使用Javascript 使用引号和*,javascript,angularjs,regex,Javascript,Angularjs,Regex,我试图编写一个正则表达式来验证用户输入的文本。我希望将正则表达式与指令一起使用,因此应避免使用g标志 本质上,有许多“简单”的规则 必须有一个或多个单词 不允许使用单引号(”) 允许使用双引号(“),但必须成对使用,即打开和关闭 成对双引号必须包含一个或多个单词 双引号与其相邻的单词之间不允许有空格 不允许使用星号(*),除非它紧跟在结束双引号之前,紧跟在一个单词之后,且没有空格 这里有一些例子 example match ''
g
标志
本质上,有许多“简单”的规则
”
)“
),但必须成对使用,即打开和关闭*
),除非它紧跟在结束双引号之前,紧跟在一个单词之后,且没有空格example match
'' false
' ' false
' foo' true
'foo' true
'foo bar' true
'foo bar*' false
'"foo' false
'"foo"' true
'" foo"' false
'"foo "' false
'"foo bar"' true
'"foo *"' false
'"foo*"' true
'foo*"' false
'"foo*" "bar*"' true
'foo "bar*"' true
'"foo* bar"' false
'"foo*" bar' true
我创造了
我正在努力接近任何地方
我有一个这样的表情
/(")(?:(?=(\\?))\2.)*?\1/
这将匹配成对双引号之间的文本
/^.*\*"$/
将匹配以“*”结尾的文本
正如你所看到的,我还有很长的路要走,请帮助我
正则表达式是否可能是执行此操作的错误方法
^(?=.*\b)(?=[^"]*("[^"]*"[^"]*)*$)(?![^"]*("[^"]*"[^"]*)*" *")(?!.*\*[^"])(?!.*[ "]\*)(?![^"]*("[^"]*"[^"]*)*[^"]*\*")(?![^"]*("[^"]*"[^"]*)*" \w)(?![^"]*("[^"]*"[^"]*)*"[^"]*\w ")'[^']*'$
祝您在生产代码库中使用它好运
好吧,那么大福
我们要重用的一个重要思想是如何达到一个位置,在此之前,您知道有偶数个
“
s。即:
[^"]*("[^"]*"[^"]*)*
不幸的是,我们不能在javascript正则表达式中重用模式,因此我们必须在需要的地方重复它。即:
允许使用双引号(
“
),但必须成对使用,即打开和关闭
基本上,我们说从开始(^
),当我们迭代到结束($
)时,我们匹配所述模式,即偶数的“
双引号与其相邻的单词之间不允许有空格 我们将其分为两部分-不会发生在左侧,也不会发生在右侧:
^(?!__even_quotes_pattern__" \w)
^(?!__even_quotes_pattern__\w ")
成对双引号必须包含一个或多个单词 (没有仅换行空格的成对引号)
其余的更容易: 必须有一个或多个单词 (在某些点上有一个单词边界(
\b
)
不允许使用单引号(') (或根据注释中的解释,除环绕字符串的注释外,不允许使用)
不允许使用星号(*),除非它紧跟在结束双引号之前,紧跟在单词之后,且没有空格 我们将其分为三个部分: (1) 必须在
之前“
:
(2) 必须跟在非“
或空格后面
(?!.*[ "]\*)
(3) 它不在非关闭前“
:
简洁明了的功能:
function myParser(string) {
var string = string.trim(),
wordsArray = string.split(' '),
regExp = /((?=")^["][a-zA-Z]+[*]{0,1}["]$|^[a-zA-Z]+$)/,
len = wordsArray.length,
i = 0;
// '"foo bar"' situation
if (string.match(/^["][a-zA-Z]+[\s]?[a-zA-Z]+[*]{0,1}["]$/)) {
return true;
}
for (i; i < len; i++) {
var result = wordsArray[i].match(regExp);
if (result === null) {
return false;
}
}
return true;
}
函数myParser(字符串){
var string=string.trim(),
wordsArray=string.split(“”),
regExp=/((?=”)^[“][a-zA-Z]+[*]{0,1}[“]$| ^[a-zA-Z]+$)/,
len=wordsArray.length,
i=0;
//"富吧"情况
if(string.match(/^[“][a-zA-Z]+[\s]?[a-zA-Z]+[*]{0,1}[“]$/){
返回true;
}
对于(i;i
检查结果
如果你需要解释-写在评论中,我会写详细的逻辑
(您的想法:检查2个变体(清除regExp和函数)-在10.000测试情况下-什么工作更快(并且不会失败:))?)5和6不是一回事。@ndn,我想差不多,但我不想让
*
单独成为一个词。快到了!@Martin,这么近,我已经给了他一笔赏金了。这还不能满足他所举的一半例子gives@Martin,真的吗?哪一个?在左边,进入单元测试,点击►. 过了9点/18@Martin,您已经在测试中包含了单引号。我可以确认@Martin的分析,但它比我开始时的分析要好得多。虽然我倾向于同意,这可能更容易通过函数和正则表达式组合来完成-这个问题特别需要正则表达式解决方案
^(?=.*\b)
^'[^']*'$
(?!.*\*[^"])
(?!.*[ "]\*)
(?!__even_quotes_pattern__[^"]*\*")
function myParser(string) {
var string = string.trim(),
wordsArray = string.split(' '),
regExp = /((?=")^["][a-zA-Z]+[*]{0,1}["]$|^[a-zA-Z]+$)/,
len = wordsArray.length,
i = 0;
// '"foo bar"' situation
if (string.match(/^["][a-zA-Z]+[\s]?[a-zA-Z]+[*]{0,1}["]$/)) {
return true;
}
for (i; i < len; i++) {
var result = wordsArray[i].match(regExp);
if (result === null) {
return false;
}
}
return true;
}