我正在尝试为以下模式编写正则表达式:
[MyLiteralString] [0个或更多字符不受限制] [至少1个数字]
我认为应该这样做:
(theColumnName)[\s\S]*[\d]+
查找文字字符串theColumnName
,后跟任意数量的字符(空格或其他字符),然后查找至少一个数字。但这比我想要的更多,你可以在这里看到:
https://www.regex101.com/r/HBsst1/1
(编辑)第二组更复杂的数据 - https://www.regex101.com/r/h7PCv7/1
使用该链接中的示例数据,我希望正则表达式识别theColumnName] VARCHAR(10)
的两次出现,仅此而已。
我有300多个sql脚本,其中包含每种类型的数据库对象的create语句:过程,表,触发器,索引,函数 - 一切。因此,我对我的正则表达式不能太严格。
存储过程的文件可能包含我想识别的LEFT(theColumnName, 10)
等文本。
create table语句类似于theColumnName VARCHAR(12)
。
所以它需要非常灵活,因为数字并不总是相同的。有时它是10,有时它是12,有时它是51 - 各种不同的数字。
基本上,我正在寻找与此C#代码等价的正则表达式:
//Get file data
string[] lines = File.ReadAllLines(filePath);
//Let's assume the first line contains 'theColumnName'
int theColumnNameIndex = lines[0].IndexOf("theColumnName");
if (theColumnNameIndex >= 0)
{
//Get the text proceeding 'theColumnName'
string temp = lines[0].Remove(0, theColumnNameIndex + "theColumnNameIndex".Length;
//Iterate over our substring
foreach (char c in temp)
{
if (Char.IsDigit(c))
//do a thing
}
}
答案 0 :(得分:3)
(theColumnName).*?[\d]+
它会在它看到的第一个号码后停止捕捉。
*
和*?
之间的区别在于贪婪与懒惰。例如,.*\d
会匹配abcd12ad4
中的abcd12ad4
,而.*?\d
会将其首次匹配设为abcd1
。查看this page了解详情。
顺便说一句,如果您不想要匹配换行符,请使用.
(句点)代替[\s\S]