2

如何在微软 IDE(如 VS 或 MSSQL)上使用正则表达式隔离不包含 4 个逗号的行

下面的例子

abcd,efg,hi,jk,a
abd,fef,rgr,ht
abd,aad,rhrhr,rtre
dfsf,sdf,sfsdf,sd,fs

在上面的例子中,我需要隔离线

abd,fef,rgr,ht
abd,aad,rhrhr,rtre

因为他们没有 4 个逗号

4

3 回答 3

4

在 Visual Studio (2012) 中:

^(?![^,\n]*,[^,\n]*,[^,\n]*,[^,\n]*,).*$

或者,简化:

^(?!([^,\n]*,){4}).*$

在 SQL Server Management Studio (2012) 中:

^~([^,]*,[^,]*,[^,]*,[^,]*,).*$

解释:

以上都假设我们必须排除包含 4 个或更多逗号的行。要使其仅排除包含正好 4 个逗号的行,只需将[^,\n]*$[^,]*$分别添加到括号中的部分,即:

^(?![^,\n]*,[^,\n]*,[^,\n]*,[^,\n]*,[^,\n]$).*$
^(?!([^,\n]*,){4}[^,\n]$).*$
^~([^,]*,[^,]*,[^,]*,[^,]*,[^,]$).*$

两者都使用负前瞻(有关更多详细信息,请参阅this),它们只需要不同的语法。

此外,在 SSMS 中,您不需要换行 ( \n) 检查(但包括它并没有太大变化),并且{4}语法似乎不起作用。

^- 线的开始。

(?!...)~(...)- 否定前瞻的语法。

[^,\n]*- 零个或多个不是逗号或换行符的字符。

[^,]*- 零个或多个非逗号字符。

.*- 零个或多个。

$- 行结束。

{4}- 恰好出现在它之前的任何内容的 4 次。

为什么不只是这个?

^(?!.*,.*,.*,.*,).*$

有人可能会争辩说你可以只使用上面的,但这实际上会更慢,因为它需要回溯,因为第一个.*将尝试匹配整行,然后它会回溯到最后一个,,下一个.*将匹配整行,然后它会回溯到倒数第二个,,依此类推。

于 2013-07-26T11:50:34.137 回答
1

这个正则表达式似乎对我有用:

(^(\w*?,){0,3}\w*$|^(\w*?,){5,}\w*$)

它搜索包含 0 到 3 或 5 次或更多逗号的行。随意\w用任何必要的字符类代替。

示例:http ://www.regex101.com/r/aZ0wI3

于 2013-07-26T11:50:29.283 回答
0

试试这个 .+,.+,.+,.+,.+ 它将匹配所有带有 4 个逗号的文本(假设行不以逗号开头,不以逗号结尾,2 个逗号之间至少有一个字符)

于 2013-07-26T11:50:17.070 回答