如何找到一个特定的字符串,后跟一个数字,其间有多少个字符?

如何找到一个特定的字符串,后跟一个数字,其间有多少个字符?

问题描述:

我试着写了下面的模式正则表达式:如何找到一个特定的字符串,后跟一个数字,其间有多少个字符?

[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将匹配abcd12ad4abcd12ad4中,而.*?\d将其第一匹配作为abcd1。请查看this page了解更多信息。

顺便说一句,如果你想匹配换行符,使用.(周期),而不是[\s\S]