使用Regex是否有一种方法可以匹配字符串中的外部字符并排除内部字符?

时间:2012-12-03 21:48:56

标签: regex

我知道我可以使用前瞻和后视排除字符串中的外部字符,但我不确定中心的字符。

我想要的是从字符串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

同样,有没有办法用一个正则表达式字符串来做到这一点?

2 个答案:

答案 0 :(得分:3)

由于大多数语言中的正则表达式替换功能不会更改其运行的字符串(但会产生新的字符串),因此您可以在大多数语言中将其作为单行使用。首先,您匹配所有内容,捕获所需的部分:

^.*(ABC).*(DEF).*$

(如果您的输入包含换行符,请确保使用单行/“dotall”选项!)

然后将其替换为:

$1$2

这将在一项任务中为您提供ABCDEF

然而,正如评论和Mark的答案中所述,引擎 匹配ABCDEF之间的内容。它只是替换便利功能抛出它。但我会说,几乎所有语言都支持这一点。

重要提示:这种方法当然只有在您的输入字符串只包含所需模式一次时才会起作用(假设ABCDEF实际上是变量)。

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"
    // ...
}