我知道我可以使用前瞻和后视排除字符串中的外部字符,但我不确定中心的字符。
我想要的是从字符串ABCDEF
获得ABC 123 DEF
的匹配。
这是否可以使用正则表达式字符串?如果没有,可以用另一种方式完成吗?
修改
有关更多说明,在上面的示例中,我可以使用正则表达式字符串/ABC.*?DEF/
来获取我想要的内容,但这包括.*?
匹配的所有内容。我想要的是匹配ABC(match whatever, but then throw it out)DEF
之类的内容,从而导致ABCDEF
的一次匹配。
作为另一个例子,我可以执行以下操作(在sudo-code和regex中):
string myStr = "ABC 123 DEF";
string tempMatch = RegexMatch(myStr, "(?<=ABC).*?(?=DEF)"); //Returns " 123 "
string FinalString = myStr.Replace(tempMatch, ""); //Returns "ABCDEF". This is what I want
同样,有没有办法用一个正则表达式字符串来做到这一点?
答案 0 :(得分:3)
由于大多数语言中的正则表达式替换功能不会更改其运行的字符串(但会产生新的字符串),因此您可以在大多数语言中将其作为单行使用。首先,您匹配所有内容,捕获所需的部分:
^.*(ABC).*(DEF).*$
(如果您的输入包含换行符,请确保使用单行/“dotall”选项!)
然后将其替换为:
$1$2
这将在一项任务中为您提供ABCDEF
。
然而,正如评论和Mark的答案中所述,引擎 匹配ABC
和DEF
之间的内容。它只是替换便利功能抛出它。但我会说,几乎所有语言都支持这一点。
重要提示:这种方法当然只有在您的输入字符串只包含所需模式一次时才会起作用(假设ABC
且DEF
实际上是变量)。
PHP中的示例实现:
$output = preg_replace('/^.*(ABC).*(DEF).*$/s', '$1$2', $input);
或JavaScript(没有单行模式):
var output = input.replace(/^[\s\S]*(ABC)[\s\S]*(DEF)[\s\S]*$/, '$1$2');
或C#:
string output = Regex.Replace(input, @"^.*(ABC).*(DEF).*$", "$1$2", RegexOptions.Singleline);
答案 1 :(得分:2)
正则表达式可以包含多个捕获组。每个组必须由连续的字符组成,因此不可能有一个组可以捕获您想要的内容,但组本身不必是连续的,因此您可以组合多个组来获得所需的结果。
正则表达式
(ABC).*(DEF)
<强>捕获强>
ABC
DEF
在线查看:rubular
示例C#代码
string myStr = "ABC 123 DEF";
Match m = Regex.Match(myStr, "(ABC).*(DEF)");
if (m.Success)
{
string result = m.Groups[1].Value + m.Groups[2].Value; // Gives "ABCDEF"
// ...
}