如何使用 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 组中的一个数字,从 1
到 9
,任何 0+ 数字,然后是一个可选的空格,然后只匹配 m
. Meter
替换将替换为第 1 组的内容,然后添加 Meter
.
如果您需要确保 m
后面没有跟字符字符,请使用 "([1-9][0-9]*\s?)m\b"
正则表达式(即在 [= 之后添加 \b
,一个单词边界14=]).
我想用 '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 组中的一个数字,从 1
到 9
,任何 0+ 数字,然后是一个可选的空格,然后只匹配 m
. Meter
替换将替换为第 1 组的内容,然后添加 Meter
.
如果您需要确保 m
后面没有跟字符字符,请使用 "([1-9][0-9]*\s?)m\b"
正则表达式(即在 [= 之后添加 \b
,一个单词边界14=]).