【问题标题】:A patteren which matches a but ignores that a which is substring of b [duplicate]与 a 匹配但忽略作为 b 子字符串的 a 的模式 [重复]
【发布时间】:2012-11-21 14:04:40
【问题描述】:

可能重复:
Find a pattern to match ‘a’, ignoring that ‘a’ which lies within ‘b’ and ‘c’

如果我有以下字符串(例如)

string q = "select field1 from t1 where field1 in (select field1 from t2)";

在这种情况下,我有

a = " from"; b = @"\(.* from.*\)"; => " from" within parenthesis

这里可以看到'a'是'b'的子串

我最接近的模式是

string pat = @"^((?!\(.* from.*\)).)* from((?!\(.* from.*\)).)*$";

但我需要将“pat”修改为 'a' such that 'a' is not a sub-string of 'b'...(“a”和“b”是可变模式)。我被困在用正则表达式翻译这个。我想用

string answer=Regex.Relace(q , pat , ",field2 from");

期望的输出:(答案中的值应该是)

"select field1,field2 from t1 where field1 in (select field1 from t2)"

【问题讨论】:

  • 格式化您的代码as代码(缩进4个空格,或使用编辑器上的代码按钮)。
  • 所以你只想替换第一次出现?
  • 我将它用于通用目的,事实上我需要这样的模式,以便替换不在括号中的任何“from”......你知道它在 sql 查询中唯一的一个它可能不一定成为第一个.. 但如果它不在括号中,那么它是我所知道的唯一可能的地方
  • @SamiAkram 你的?是一个列名..对吗?
  • 感谢@Oded 让我的帖子看起来像样。并感谢您的支持..(我认为是 Anirudha)请帮助我找到并用正则表达式替换这个特殊的“来自”唯一的条件是它不应该像 (*from) 并且请帮助我发布问题。这是第一个,由于我的演示混乱,我被禁止了。我恳求人们指导我而不是投反对票,但由于投反对票而不得不将其删除两次并被禁止

标签: c# regex pattern-matching


【解决方案1】:

为什么不在匹配模式中包含 t1?

string pattern = " from t1";
string answer=Regex.Relace(q , pattern , ",field3 from t1");

【讨论】:

  • 感谢回复 t1 is not specific it is changed
【解决方案2】:

您正在尝试限制替换的数量,听起来,所以这里似乎已经回答了这个问题:

How to Regex search/replace only first occurrance in a string in .NET?

[编辑:] 回复第一条评论:

抱歉,不知道 FROM 是一个示例还是您实际尝试执行的操作。试图替换不基于可控字符串的东西是有问题的。如果你不控制所有输入的字符串,你可能还必须处理这样的情况:

SELECT [From], [To], [Email], [Subject] FROM EmailsSent

最终结果是您的正则表达式将不得不前后查看以检查括号和括号,因为您不能 100% 控制它给出的字符串。我要注意的是,您正在做的事情听起来像是一种不好的做法,只有在没有其他选择的情况下才应该这样做。看看前瞻/后向信息,您应该可以在 google 上搜索更多信息:

http://openmymind.net/2011/2/16/Regex-Positive-Negative-Look-Ahead-Behind/

【讨论】:

  • 我将它用于通用目的,事实上我需要这样的模式来替换不在括号中的任何“from”......你知道它在 sql 查询中唯一的一个它可能不一定成为第一个.. 但如果它不在括号中,那么它是我所知道的唯一可能的地方
  • @kevin Nelson 不需要look aheadlook behind。他只是想替换第一个from子句,所以使用$(结束string) 就足够了!
  • @Anirudha - 他在你上面的评论中特别说它“可能不一定是第一个”......例如SQL中的FROM表之前可能有一个子查询,例如SELECT (SELECT col FROM tab2) AS Num FROM tab1)。因此,您必须检查以确保在未关闭之前没有左括号。这是一个比仅找到第一个 FROM 复杂得多的正则表达式,这是我在编辑之前已经建议的。
【解决方案3】:
string q = "select field1,field2 from t1 where field1 in (select field1 from t2 where t2.field2>5)";

Regex r=new Regex(@"from.*$");
string s=r.Replace(q,",field3 $0");//output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多