如何使用 RegularExpressions 替换基于模式的匹配项,但保留值?

How can I use RegularExpressions to replace a match based on a pattern, but keep the value?

我想用 'meter' 替换字符串中的所有“m”。问题是我必须找到正确的模式,因为在单位符号前面可以有一个 space 组合的数字。

我已经尝试过以下模式:[1-9][0-9]*\s?m": "[1-9][0-9]*\s?Meter 使用以下代码:

static let patterns = [
    "[1-9][0-9]*\s?m": "[1-9][0-9]*\s?Meter"
];

static public func prepareText(input: String) -> String {
    var modifiedInput = input;

    for pattern in patterns.keys {
        let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive);
        modifiedInput = regex.stringByReplacingMatches(
            in: modifiedInput, options: [], range: NSMakeRange(0, modifiedInput.count),
            withTemplate: patterns[pattern]!);
    }

    return modifiedInput;
}

但现在我的参数值也发生了变化:

800 m -> [1-9][0-9]*s?Meter

那么如何让单位符号前的800保持不变呢?

您需要使用

static let patterns = [
    "([1-9][0-9]*\s?)m": "Meter"
];

"([1-9][0-9]*\s?)m" 模式将匹配并捕获第 1 组中的一个数字,从 19,任何 0+ 数字,然后是一个可选的空格,然后只匹配 m. Meter 替换将替换为第 1 组的内容,然后添加 Meter.

如果您需要确保 m 后面没有跟字符字符,请使用 "([1-9][0-9]*\s?)m\b" 正则表达式(即在 [= 之后添加 \b,一个单词边界14=]).