2016-03-26 52 views
1

我已经创建了一个从开始“结尾是”,例如,正则表达式的正则表达式的字符串的正则表达式:“mynameis”如何限制采取某些词

“\”(?:[^ \“\ \] |。\\)* \“”。?

现在我想,这个表达式不能采取{我们,我们,他们,以及}话 我如何做到这一点 举例来说,如果我输入“mynameisalexand “ 编译器必须忽略{和}并将此字符串视为”mynameisalex“

+0

如果输入的是' “mynamesarealexandandrew”'?它应该是“mynamesarealexrew”吗? –

+0

是啊!只是作为一个例子。还有其他的话我会限制。我只是需要一个主意! – Ali

+0

难道你不能在捕获的字符串上使用通常的字符串操作方法吗? –

回答

1

因为没有办法,以配合正则表达式非连续文本,你仍然可以使用你的正则表达式或展开一个:

"[^"\\]*(?:\\.[^"\\]*)*" 

regex demo

,并删除你定义的子仅仅是String.Replace(或者像we|and|...那样的正则表达式)。

C# demo

var input = "\"mynamesarealexandandrew\" \"mynameisalexand\""; 
var regex = new Regex(@"""[^""\\]*(?:\\.[^""\\]*)*""", RegexOptions.IgnorePatternWhitespace); 
var results = regex.Matches(input).Cast<Match>() 
        .Select(p => p.Value.Replace("we", "") 
             .Replace("us", "") 
             .Replace("they", "") 
             .Replace("and", "")) 
        .ToList(); 
foreach (var s in results) // DEMO 
{ 
    Console.WriteLine(s); 
} 
0

之后您需要清理字符串;正则表达式只是不够强大。

事实上,你得到的是一个上下文无关的语法!如果我们将可接受的令牌称为'id',那么您已经定义了一种看起来像这样的语言;

id (('and'|'we'|'us') id?)* 

也就是说,至少有一个id;那么字and,weus,然后另一个可能的ID,也许。整个事情然后重复,让您匹配

mynameisandrewbutheyarebothcalledsarah

为 ID:mynameis '和' ID:rewbut '他们' ID:arebothcalledsarah

所以,这是什么是已知的作为一种上下文无关语言,正则表达式无法解析这种事情。你最好的选择是把不可接受的词分开,最后把它们拼在一起。