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

时间:2017-12-05 13:03:38

标签: regex swift replace pattern-matching nsregularexpression

我希望用“米”替换我的字符串中的所有内容。问题是我必须找到正确的模式,因为单位符号前面的空格可以有一个数字。

我已经尝试了以下模式:[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保持在单位符号前面?

1 个答案:

答案 0 :(得分:1)

您需要使用

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

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

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