0

使用通配符搜索不同的字符串,例如搜索test0?(后面有一个空格?)。搜索产生的字符串是:

test01 
test02 
test03 
(and so on)

替换文本应为例如:

test0? - 

上面的通配符test0? -表示 1、2 或 3...

因此,替换字符串应该是:

test01 - 
test02 - 
test03 - 

string pattern = WildcardToRegex(originalText);
fileName = Regex.Replace(originalText, pattern, replacementText);

public string WildcardToRegex(string pattern)
{
    return "^" + System.Text.RegularExpressions.Regex.Escape(pattern).
        Replace("\\*", ".*").Replace("\\?", ".") + "$";
}

问题是用原始字符加上添加的字符保存新字符串。我可以搜索字符串并通过一些字符串操作来保存原始字符串,但这似乎开销太大。必须有一个更简单的方法。

感谢您的任何意见。

编辑:

使用通配符搜索字符串?可能的字符串是:
test01 someText
test02 someotherText
test03 moreText

使用正则表达式,搜索字符串模式将是:
test0? -
因此,每个字符串都应为:
test01 - someText
test02 - someotherText
test03 - moreText

如何保留被正则表达式通配符“?”替换的字符?

正如我的代码所代表的那样,它会作为测试出来吗?- someText
那是错误的。

谢谢。

编辑数字 2

首先,感谢大家的回答和指导。它确实帮助并引导我走上正确的道路,现在我可以更好地提出确切的问题:
它与替换有关。

在正则表达式之后插入文本。

我给出的示例字符串,它们可能并不总是那种格式。我一直在研究替换,但似乎无法正确使用语法。我正在使用 VS 2008。

还有什么建议吗?

谢谢

4

4 回答 4

2

如果你想用“test0?-”替换“test0?”,你会写:

string bar = Regex.Replace(foo, "^test0. ", "$0- ");

这里的关键是$0 替换,它将包含匹配的文本。

因此,如果我正确理解您的问题,您只希望您replacementText"$0- ".

于 2013-08-21T15:43:47.903 回答
0

如果我正确理解了这个问题,你就不能用火柴吗?

//Convert pattern to regex (I'm assuming this can be done with your "originalText")
Regex regex = pattern;

//For each  match, replace the found pattern with the original value + " -"
foreach (Match m in regex.Matches)
{
    RegEx.Replace(pattern, m.Groups[0].Value + " -");
}
于 2013-08-21T15:47:36.450 回答
0

所以我不是 100% 清楚你在做什么,但我会试一试。

我假设您要使用“文件通配符”(?/ *)并搜索一组匹配的值(同时保留使用占位符本身存储的值),然后用新值替换它(重新插入这些占位符)。鉴于此,可能有很多矫枉过正(因为你的要求有点奇怪)这就是我想出的:

// Helper function to turn the file search pattern in to a
// regex pattern.
private Regex BuildRegexFromPattern(String input)
{
    String pattern = String.Concat(input.ToCharArray().Select(i => {
        String c = i.ToString();
        return c == "?" ? "(.)"
            : c == "*" ? "(.*)"
            : c == " " ? "\\s"
            : Regex.Escape(c);
    }));
    return new Regex(pattern);
}

// perform the actual replacement
private IEnumerable<String> ReplaceUsingPattern(IEnumerable<String> items, String searchPattern, String replacementPattern)
{
    Regex searchRe = BuildRegexFromPattern(searchPattern);

    return items.Where(s => searchRe.IsMatch(s)).Select (s => {
        Match match = searchRe.Match(s);
        Int32 m = 1;
        return String.Concat(replacementPattern.ToCharArray().Select(i => {
            String c = i.ToString();
            if (m > match.Groups.Count)
            {
                throw new InvalidOperationException("Replacement placeholders exceeds locator placeholders.");
            }
            return c == "?" ? match.Groups[m++].Value
                : c == "*" ? match.Groups[m++].Value
                : c;
        }));
    });
}

然后,在实践中:

String[] samples = new String[]{
    "foo01", "foo02 ", "foo 03",
    "bar0?", "bar0? ", "bar03 -",
    "test01 ", "test02 ", "test03 "
};

String searchTemplate = "test0? ";
String replaceTemplate = "test0? -";

var results = ReplaceUsingPattern(samples, searchTemplate, replaceTemplate);

从上面的samples列表中,它给了我:

matched:      & modified to:

test01         test01 -
test02         test02 -
test03         test03 -

但是,如果您真的想省去麻烦,您应该使用替换参考。没有必要重新发明轮子。上面的内容可以替换为:

Regex searchRe = new Regex("test0(.*)\s");
samples.Select(x => searchRe.Replace(s, "test0$1-"));
于 2013-08-21T15:55:16.693 回答
0

您可以使用符号 $ 后跟捕获元素的索引(它从索引 1 开始)捕获任何匹配的字符串并将其放置在替换语句中的任何位置。

您可以使用括号“()”捕获元素

例子:

如果我有几个带有 testXYZ 的字符串,XYZ 是一个 3 位数字,我需要用 testZYX 替换它,反转 3 位数字,我会这样做:

string result = Regex.Replace(source, "test([0-9])([0-9])([0-9])", "test$3$2$1");

因此,在您的情况下,可以这样做:

string result = Regex.Replace(source, "test0([0-9]) ", "test0$1 - ");
于 2013-08-21T16:58:58.327 回答