如何找到一个特定的字符串后跟一个数字,其中包含任意数量的字符?

时间:2017-02-23 16:49:25

标签: regex

我正在尝试为以下模式编写正则表达式:

  

[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
    }
}

1 个答案:

答案 0 :(得分:3)

(theColumnName).*?[\d]+

它会在它看到的第一个号码后停止捕捉。

**?之间的区别在于贪婪与懒惰。例如,.*\d会匹配abcd12ad4中的abcd12ad4,而.*?\d会将其首次匹配设为abcd1。查看this page了解详情。

顺便说一句,如果您想要匹配换行符,请使用.(句点)代替[\s\S]