正则表达式 - 与可选[]匹配?

正则表达式 - 与可选[]匹配?

问题描述:

我试图做一个模式匹配来剔除,从长SQL脚本,任何地方它有以下几点:正则表达式 - 与可选[]匹配?

USE [DBName] 
USE DBName 

我有了第一个正则表达式,但对于第二个?我如何指定[]是可选的,但是整行必须匹配?

语法第一:

@"USE \[(.*?)\]" 
+1

那是一个.net正则表达式?你应该添加适当的标签。 – Kobi

+0

你应该接受最能帮助你的答案。 – Raphael

如何:

@"^USE \s (([^ \[\] ]+) | (\[ [^ \[\] ]+ \]))$" 

([^ \[\] ]+)匹配任何非[]字符;否则,(\[ [^ \[\] ]+ \])匹配[...]

+0

这并不是真的如何工作。您可能需要'@“^ USE \ s([^ \ [\]] + | \ [[^ \ [\]] + \])$”' – Kobi

+0

谢谢大家。我在应用所有建议时必须做错,因为当我在文件/字符串中使用USE语句时,无法完全找到匹配项:USE [TestDB] –

可以使用?量词:

@"USE \[?(\w+)\]?" 

它检查是否存在零或前面的表达式(也,你忘逃脱“[”和“]”)中的一个。

+0

Thanks all。在应用所有建议时,我必须做错某些事情,因为当我在文件/字符串中使用USE语句时,它无法完全找到匹配项:USE [TestDB] –

+0

@Ahmed ilyas,​​检查答案的编辑。我已经将'\。*?'(任何字符,不是贪婪)改成了'\ w +?'(至少有一个字是char,而不是贪婪)。它将匹配任何可能的数据库名称,因为数据库名称不能包含任何不是字母,数字或下划线的字符。 “任何字符”部分扭曲了正则表达式。 (并且不要忘记将“不区分大小写”标志添加到正则表达式=)。 – Raphael

?量词是指0或1:

@"USE \[?(.*?)\]?" 

这也将匹配USE [DBNameUSE DBName],但因为它是默认的贪婪它不会是一个问题,除非你确实有这样的行你的SQL脚本(在这种情况下,你可能希望它们被剥离:P)。

不是很漂亮,但至少这不会捕捉USE [DBNameUSE DBName]

^USE (?=\[\w+\]$|\w+$)\[?(\w+)