首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >regex用函数替换匹配并删除其他匹配

regex用函数替换匹配并删除其他匹配
EN

Stack Overflow用户
提问于 2014-01-28 20:22:10
回答 1查看 70关注 0票数 0

我有一个字符串,如下所示,我想用函数的输出替换FieldNN实例。

到目前为止,我已经能够用函数的输出替换NN实例。但我不知道如何用相同的正则表达式删除静态“字段”部分。

输入字符串:

代码语言:javascript
复制
(Field30="2010002257") and Field1="yuan" not Field28="AAA"

所需产出:

代码语言:javascript
复制
(IncidentId="2010002257") and Author="yuan" not Recipient="AAA"

这是我到目前为止掌握的代码:

代码语言:javascript
复制
public string translateSearchTerm(string searchTerm) {
    string result = "";

    result = Regex.Replace(searchTerm.ToLower(), @"(?<=field).*?(?=\=)", delegate(Match Match) {
        string fieldId = Match.ToString();
        return String.Format("_{0}", getFieldName(Convert.ToInt64(fieldId)));
    });

    log.Info(String.Format("result={0}", result));

    return result;
}

这意味着:

代码语言:javascript
复制
(field_IncidentId="2010002257") and field_Author="yuan" not field_Recipient="aaa"

我想解决的问题是:

  1. 从输出中删除静态“字段”前缀。
  2. 使正则表达式在"FieldNN“部分上无效,而不是小写引用的文本部分。
  3. 使正则表达式更健壮,使引用的字符串部分使用双引号或单引号。
  4. 使正则表达式更加健壮,从而忽略空格: FieldNN="AAA“与FieldNN= "AAA”

我真的只需要解决第一个问题,其他三个将是一个额外的,但我可能会修复这些一旦我发现了正确的模式,空格和引号。

更新

我认为下面的模式解决了问题2和问题4。

代码语言:javascript
复制
result = Regex.Replace(searchTerm, @"(?<=\b(?i:field)).*?(?=\s*\=)", delegate(Match Match) 
EN

Stack Overflow用户

回答已采纳

发布于 2014-01-28 20:46:40

要解决第一个问题,请使用组而不是积极的查找:

代码语言:javascript
复制
public string translateSearchTerm(string searchTerm) {
    string result = "";

    result = Regex.Replace(searchTerm.ToLower(), @"field(.*?)(?=\=)", delegate(Match Match) {
        string fieldId = Match.Groups[1].Value;
        return getFieldName(Convert.ToInt64(fieldId));
    });

    log.Info(String.Format("result={0}", result));

    return result;
}

在这种情况下,“字段”前缀将包括在每个匹配中,并将被替换。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21415970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档