E.g。我想测试一个字符串是一个以逗号分隔的列表,没有空元素。 (这也意味着字符串不以逗号开头或结尾。)
在程序上,我可以/会做这样的事情(例如JavaScript):
function isValid(str) {
return str.split(',').every(function (substr) {
return substr.length > 0;
});
}
我可以用正则表达式实现吗?我正在努力做到这一点,也许是因为我没有像前瞻这样的功能。
谢谢!
答案 0 :(得分:3)
我可能实际上有。
/^[^,]+(,[^,]+)*$/
这样说:从一个或多个非逗号开始,然后如果还有其他内容,则必须是逗号,后跟一个或多个非逗号,重复。
似乎适用于我测试过的所有情况:
// should pass:
x
xy
x,y
x,y,z
// should fail:
,
x,
,x
,x,
x,y,
,x,y
,x,y,
但我不确定我是否遗漏了任何案件。
答案 1 :(得分:0)
可能最简单的测试方法实际上是你不想要的东西 - 一个简单的表达方式:
/,\s*,/
将匹配两个逗号,它们之间没有非空白字符。
更简单一点,检查/,,/
将返回两个相邻的逗号,这些逗号实际上与您在那里执行的测试相同,但它不会捕获到行尾。< / p>
这也会记录行开头和结尾:
/^,|,\s*,|,$/ // cuts out whitespace
/^,|,,|,$/ // if you're only interested in neighbouring commas.
答案 2 :(得分:0)
为何选择正则表达式?你想要 another problem 吗?
保持简单:
function isValid(str)
{
// if first or last character is comma, its invalid
if (str.charAt(0)==',' || str.charAt(str.length-1)==',')
return false;
// the length of the string
var length_before = str.length;
// the length of the string after checking for empty csv elements (,,)
var length_after = str.replace(/,,/g,'').length;
// if there is a difference, there must be an empty element, so its invalid.
// if there is no difference, is valid.
return length_before==length_after;
}
这里的工作示例: http://jsfiddle.net/jw6sdu6q/1/
P.S。具有讽刺意味的是我正在使用替换全局标识符,这是唯一的解决方案AFAIK,谢谢你的javascript替换功能。