正则表达式匹配以逗号分隔的字符串,但行末没有逗号

4
我正在尝试编写一个正则表达式,允许键盘上的所有字符输入(包括空格),但将限制在行末输入逗号。我尝试过使用包括所有可能字符的表达式,但仍无法得到正确的输出:
   [RegularExpression("^([a-zA-Z0-9\t\n ./<>?;:\"'!@#$%^&*()[]{}_+=|\\-]+,)*[a-zA-Z0-9\t\n ./<>?;:\"'!@#$%^&*()[]{}_+=|\\-]+$", ErrorMessage = "Comma is not allowed at the end of {0} ")]

3
只需在正则表达式末尾使用(?<!,)$ - vks
@vks,我不明白你的意思。我是应该在所有字符中使用(?<!,)$还是只在(?<!,)$中使用? - Sumedha Vangury
3个回答

5
^.*[^,]$

.*代表所有字符,不需要这么长


你能告诉我这是如何工作的吗?你同时使用了 .* 和 , 的转义序列,那么它是如何检测到行末的逗号的呢? - Sumedha Vangury
在正则表达式中,'.' 不代表 '所有字符' 。此外,取决于多行标志的使用方式, '^' 和 '$' 也可能存在歧义。 - Wiktor Stribiżew
[^,] 匹配除了逗号以外的任何字符。 - Kerwin
如果您不想在行末允许逗号后的空格,该怎么办? - Nader Hisham
1
@NaderHisham 这仍然有效,即使逗号后面有空格,代码也会完全执行所需的操作。 - Sumedha Vangury
@nader-hisham 它只不允许逗号在末尾,逗号在其他地方将匹配.* 它匹配逗号和空格。 - Kerwin

2
^([a-zA-Z0-9\t\n ./<>?;:\"'!@#$%^&*()[]{}_+=|\\-]+,)*[a-zA-Z0-9\t\n ./<>?;:\"'!@#$%^&*()[]{}_+=|\\-]+(?<!,)$

                                                                                                        ^^

只需在末尾添加lookbehind即可。

你应该解释一下这是什么以及为什么它能够工作。我猜测它的意思是“匹配除逗号以外的前一个分组所匹配到的任何内容”。 - Panagiotis Kanavos
有没有更简单的方法?而不是显式地编写所有字符。 - Sumedha Vangury

0
一个正则表达式,允许键盘上的所有字符输入(包括空格),但限制在行末输入逗号。
请注意,您可以使用键盘键入比您键入的更多内容。基本上,您想允许任何字符,但不允许在行末输入逗号。
因此,
(?!,).(?=\r\n|\z)

这个正则表达式是检查每一行(因为有 (?=\r\n|$) 前瞻),而 (?!,) 前瞻确保最后一个字符(我们使用 . 匹配)不是逗号。 \z 是一个明确的字符串结束锚点。

参见 正则表达式演示

这在客户端也可以工作。

要获取完整的行匹配,只需在模式的开头添加 .*(因为我们没有使用单行标志,. 不会匹配换行符):

.*(?!,).(?=\r\n|\z)

或者(使用原子组或内联多行选项和^行锚点可以加快速度,但无法在客户端上工作)

(?>.*)(?!,).(?=\r\n|\z)
(?m)^.*?(?!,).(?=\r\n|\z) // The fastest of the last three

请查看演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接