【问题标题】:How can I use RegularExpressions to replace a match based on a pattern, but keep the value?如何使用正则表达式替换基于模式的匹配,但保留值?
【发布时间】:2018-05-19 03:43:24
【问题描述】:

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

我已经尝试过以下模式:[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呢?

【问题讨论】:

    标签: regex swift replace pattern-matching nsregularexpression


    【解决方案1】:

    你需要使用

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

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

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

    【讨论】:

    • 感谢您提供这个非常有用的答案!这是正确的做法!
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多