1

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

我想要的是ABCDEF从字符串中得到一个匹配项ABC 123 DEF

这可以用正则表达式字符串吗?如果没有,是否可以通过其他方式完成?

编辑

为了更清楚地说明,在上面的示例中,我可以使用正则表达式字符串/ABC.*?DEF/来排序得到我想要的,但这包括匹配的所有内容.*?。我想要的是匹配类似ABC(match whatever, but then throw it out)DEF导致一个匹配的ABCDEF.

作为另一个示例,我可以执行以下操作(在 sudo 代码和正则表达式中):

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

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

4

2 回答 2

3

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

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

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

然后将其替换为:

$1$2

这会给你ABCDEF一个任务。

尽管如此,正如评论和马克的回答中所述,引擎确实匹配和之间的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);
于 2012-12-03T22:15:18.950 回答
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"
    // ...
}
于 2012-12-03T21:50:46.353 回答