【问题标题】:Get string between two words using C# regex [duplicate]使用C#正则表达式获取两个单词之间的字符串[重复]
【发布时间】:2017-12-27 08:44:13
【问题描述】:

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

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;

输出:SELECT \"NORTHWIND\".\"CUSTOMER_DETAILS_NORTHWIND\".\"CUSTOMER_ID\" FROM

但我期望结果没有 SELECT 和 FROM 关键字。

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

谁能建议我如何做到这一点?

【问题讨论】:

  • 尝试查找 SELECT 并查找 FROM 关键字。

标签: c# regex


【解决方案1】:
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 的情况下尽量少写字母;另一个建议是使用 不区分大小写 正则表达式选项
  • @DmitryBychenko 我添加了不区分大小写的搜索。
  • 想象一下,你有"select myField from MyTable, (select otherField from other table) ..." 查询,似乎只想要myField 匹配,而不是myField from MyTable, (select otherField 匹配;这就是为什么获得尽可能少的信件是合理的:(.+?)
  • 很容易找到一个反例正则表达式不是解析器),比如select /*select 1 from dual*/ myField as "from", myOther from MyTable ;但是,正则表达式尽其所能,+1
【解决方案2】:
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();

【讨论】:

  • OP 必须使用Trim 来消除空格。
【解决方案3】:

你也可以不用RegEx

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"

【讨论】:

    【解决方案4】:

    给你:

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

    不需要捕获组,只需使用正则表达式匹配 (也可以去掉“SELECT\s+(只是额外的验证)

    【讨论】:

    • 这不是有效的 .NET 正则表达式。你可以自己看here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多