如何找到一个特定的字符串,后跟一个数字,其间有多少个字符?
问题描述:
我试着写了下面的模式正则表达式:如何找到一个特定的字符串,后跟一个数字,其间有多少个字符?
[MyLiteralString] [0个或多个字符不加限制] [至少1位]
我想这应该这样做:
(theColumnName)[\s\S]*[\d]+
,因为它看起来为文字串theColumnName
,接着任意数目的字符(空格或其他方式),然后至少一个数位。但这种匹配比我更想要的,因为你可以在这里看到:
https://www.regex101.com/r/HBsst1/1
(EDIT)第二组更复杂的数据 - https://www.regex101.com/r/h7PCv7/1
在链接使用的样本数据,我想正则表达式以确定theColumnName] VARCHAR(10)
的两个事件,仅此而已。
我有300多个SQL脚本,其中包含每种类型的数据库对象的创建语句:过程,表,触发器,索引,函数 - 一切。因此,我对正则表达式不能太严格。
存储过程的文件可能包含我想识别的文本,如LEFT(theColumnName, 10)
。
创建表语句就像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
}
}
答
(theColumnName).*?[\d]+
这会让它停下来看到的第一个数字后捕获。
*
和*?
之间的差异是关于贪婪与懒惰。例如.*\d
将匹配abcd12ad4
在abcd12ad4
中,而.*?\d
将其第一匹配作为abcd1
。请查看this page了解更多信息。
顺便说一句,如果你不想匹配换行符,使用.
(周期),而不是[\s\S]