使用C#正则表达式获取两个单词之间的字符串

3

我想获取两个字符串之间的文本。为此,我尝试了以下代码。

string q = "SELECT \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\".\"CUSTOMER_ID\" FROM \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\"";
        Regex regex = new Regex("SELECT(.*)FROM");
var result = regex.Match(q).Value;

输出:从\"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\"表中选择\"CUSTOMER_ID\"。

但我希望结果不包含SELECT和FROM关键字。

期望输出:\"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\".\"CUSTOMER_ID\"

有人能建议我如何实现吗?


尝试使用lookbehind来匹配SELECT关键字,使用lookahead来匹配FROM关键字。 - undefined
4个回答

6
var match = Regex.Match(s, @"(?i)SELECT\s+(.+?)\s+FROM");
if (match.Success)  {
    Console.WriteLine(match.Groups[1].Value);
}

我建议使用(.+?) - 尽量少获取字母,以防止出现select 123 from select 456 from mytable的情况;另一个建议是使用不区分大小写的正则表达式选项。 - undefined
@DmitryBychenko 我添加了不区分大小写的搜索功能。 - undefined
想象一下,你有一个查询语句 "select myField from MyTable, (select otherField from other table) ...",看起来是想要匹配 myField,而不是 myField from MyTable, (select otherField;所以尽可能地获取少量的字母是合理的:(.+?) - undefined
找到一个反例正则表达式不是一个解析器)很容易,比如select /*select 1 from dual*/ myField as "from", myOther from MyTable;然而,正则表达式尽力而为,+1。 - undefined

0
string input = "SELECT \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\".\"CUSTOMER_ID\" FROM \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\"";

Regex regex = new Regex("SELECT(.*)FROM");
var result = regex.Match(input);
var output = result.Groups[1].ToString();

-1

你也可以不用 正则表达式 来完成。

public static string GetBetweenTwoWords(string firstWord,string secondWord,string str){
    var firstWordIndex = str.IndexOf(firstWord) + firstWord.Length;
    var secondWordIndex = str.IndexOf(secondWord);
    return str.Substring(firstWordIndex,secondWordIndex - firstWordIndex);
}

测试:

static void Main(string[] args)
{
    string q = "SELECT \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\".\"CUSTOMER_ID\" FROM \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\"";
    Console.WriteLine(GetBetweenTwoWords("SELECT","FROM",q));

}

输出:

"NORTHWIND"."CUSTOMER_DETAILS_NORTHWIND"."CUSTOMER_ID"

-2

给你:

  "SELECT\s+\K\\".*(?=\sFROM)

不需要捕获组,只需获取正则表达式匹配结果 (你也可以移除 "SELECT\s+ 这部分,它只是额外的验证)

1
这不是一个有效的.NET正则表达式。你可以自己在这里查看。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接