我用java制作了一个应用程序,现在我需要转到C# (UWP)。我需要转换以下正则表达式,但是C#不支持所有格限定符,因此"?+“部分崩溃了regex对象。(其余的看上去很好)
Regex:(?<!({0})(?:({1}))?)(?:({2}))?\b({3})(e?s|x)?\b(?:\s({4})[sx]?)?+(?!(\s{5}))
该表达式是根据用户输入动态构建的。
Parts:
- {0}: exclude prefix
- {1}: include prefix
- {2}: include prefix
- {3}: include expression (is the word to find)
- {4}: include suffix
- {5}: exclude suffixLogic:
- Find the word `{3}`.
- Join the "include" prefix `{1}` & `{2}`, if presents, to the found
word.
- Join the "include" suffix `{4}`, if present, to the found word.
- Don't match anything if the word (even if preceeded by the "include"
prefix) is preceeded by the "exclude" prefix `{0}`.
- Don't match anything if the word (even if followed by the "include"
suffix) is followed by the "exclude" suffix `{5}`.具体例子:(?<!({la})(?:({petite}))?)(?:({petite}))?\b({maison})(e?s|x)?\b(?:\s({bleu})[sx]?)?+(?!(\s{ciel}))
Should match:
- maison
- petite maison
- maison bleue
- petite maison bleue
Should not match:
- la maison
- maison ciel
- la petite maison
- maison bleue ciel
- la petite maison bleue
- petite maison bleue ciel
- la maison bleue ciel
- la petite maison ciel
- la maison ciel
- la petite maison bleue ciel如果您有建议,则表达式可以更改,但需要给出相同的结果。
注意:我尝试过使用PCRE.NET Nuget,但是它似乎用一个查找表达式创建了另一个问题(在偏移量0处,查找断言的长度不是固定的)。
所以..。有人能帮我吗?
发布于 2020-11-07 23:42:28
您可以使用原子组:
(?<!\bla\s+(?:petite\s+)?)(?:petite\s+)?(?>maison(?:e?s|x)?\b(?:\s+bleu[sxe]?)?)(?!\s+ciel)见.NET regex演示。
详细信息
(?<!\bla\s+(?:petite\s+)?) -字符串中的一个位置,它的前面没有整个单词la (\b是一个单词边界),后面跟着1+空格以及petite和1+空白空间的一个可选序列。(?:petite\s+)? -一个可选的petite和1+白空间序列(?>maison(?:e?s|x)?\b(?:\s+bleu[sxe]?)?) -,与maison匹配的原子组,然后是可选e的可选序列,然后是s或x,然后是单词边界,然后是1+空格和bleu的可选序列,后面跟着1或0 s、x或e(?!\s+ciel) -没有跟在1+白空间和ciel后面。请参阅C#演示:
var rx = @"(?<!\bla\s+(?:petite\s+)?)(?:petite\s+)?(?>maison(?:e?s|x)?\b(?:\s+bleu[sxe]?)?)(?!\s+ciel)";
var strings = new List<String> {" - maison"," - petite maison"," - maison bleue",
" - petite maison bleue"," - la maison"," - maison ciel"," - la petite maison",
" - maison bleue ciel"," - la petite maison bleue"," - petite maison bleue ciel",
" - la maison bleue ciel"," - la petite maison ciel"," - la maison ciel"," - la petite maison bleue ciel"};
foreach (var s in strings)
{
Console.WriteLine("{0} => \"{1}\"", s, Regex.Match(s, rx)?.Value);
}输出:
- maison => "maison"
- petite maison => "petite maison"
- maison bleue => "maison bleue"
- petite maison bleue => "petite maison bleue"
- la maison => ""
- maison ciel => ""
- la petite maison => ""
- maison bleue ciel => ""
- la petite maison bleue => ""
- petite maison bleue ciel => ""
- la maison bleue ciel => ""
- la petite maison ciel => ""
- la maison ciel => ""
- la petite maison bleue ciel => ""https://stackoverflow.com/questions/64723690
复制相似问题