首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何支持将此正则表达式从JAVA转换为C#?

如何支持将此正则表达式从JAVA转换为C#?
EN

Stack Overflow用户
提问于 2020-11-07 01:49:14
回答 1查看 109关注 0票数 0

我用java制作了一个应用程序,现在我需要转到C# (UWP)。我需要转换以下正则表达式,但是C#不支持所有格限定符,因此"?+“部分崩溃了regex对象。(其余的看上去很好)

Regex:(?<!({0})(?:({1}))?)(?:({2}))?\b({3})(e?s|x)?\b(?:\s({4})[sx]?)?+(?!(\s{5}))

该表达式是根据用户输入动态构建的。

代码语言:javascript
复制
Parts: 
 - {0}: exclude prefix 
 - {1}: include prefix
 - {2}: include prefix
 - {3}: include expression (is the word to find)
 - {4}: include suffix
 - {5}: exclude suffix
代码语言:javascript
复制
Logic: 
 - 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}))

代码语言:javascript
复制
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处,查找断言的长度不是固定的)。

所以..。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-07 23:42:28

您可以使用原子组:

代码语言:javascript
复制
(?<!\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的可选序列,然后是sx,然后是单词边界,然后是1+空格和bleu的可选序列,后面跟着1或0 sxe
  • (?!\s+ciel) -没有跟在1+白空间和ciel后面。

请参阅C#演示:

代码语言:javascript
复制
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);
}

输出:

代码语言:javascript
复制
 - 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 => ""
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64723690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档