Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已包含通配符的字符串上的模式匹配_C#_Regex_Wildcard - Fatal编程技术网

C# 已包含通配符的字符串上的模式匹配

C# 已包含通配符的字符串上的模式匹配,c#,regex,wildcard,C#,Regex,Wildcard,我有一个场景,我想在已经有通配符的字符串上使用通配符模式进行搜索。用我的话说,这是一个双向模式匹配要求 输入和模式字符串可以有以下通配符之一/两个-?表示单个字符,%表示零个或多个字符。假设输入和模式字符串中只允许使用这两个通配符 例如: bool IsMatch(字符串输入,字符串模式)//如果输入字符串与模式匹配,则应返回True,否则应返回False IsMatch(“XYZ%”,“?Y%”//应返回True IsMatch(“YY?”,“?Y%”//应该返回True-输入字符串中的最后一

我有一个场景,我想在已经有通配符的字符串上使用通配符模式进行搜索。用我的话说,这是一个双向模式匹配要求

输入和模式字符串可以有以下通配符之一/两个-?表示单个字符,%表示零个或多个字符。假设输入和模式字符串中只允许使用这两个通配符

例如:

bool IsMatch(字符串输入,字符串模式)//如果输入字符串与模式匹配,则应返回True,否则应返回False

IsMatch(“XYZ%”,“?Y%”//应返回True

IsMatch(“YY?”,“?Y%”//应该返回True-输入字符串中的最后一个字符需要一个字符,其中模式匹配到Y之后的零个或多个字符(这意味着它也包括一个字符匹配)

IsMatch(“X123”,“?Y%”//应返回False-模式所需的输入字符串中缺少Y

IsMatch(“?Y%”,“?Y%”//应返回True

IsMatch(“%”,“?Y%”//应返回True-输入字符串具有表示零个或多个字符的通配符%,也可以具有任何字符。在某种程度上,它本身就是一种模式,代表任何大小的事物


我可以找到一些文章(例如:Regex),它们只讨论对非通配符字符串执行通配符模式匹配。我正在寻找关于算法的指针/想法,因为当我开始写下它时,我越来越难想出一个能够进行这种匹配的算法。感谢您的投入。

正如我在评论中所说,对于最一般的情况,您必须创建两个表达式的最小确定性有限自动机,并比较这两个自动机。说了这么一句,你的问题可能会有一个bruteforce/poorman的解决方案

根据您的示例,您似乎对查看输入/模式之一是否与另一个生成的所有字符串匹配感兴趣

IsMatch("XYZ%", "?Y%") // returns true because ?Y% matches a superset of strings matched by "XYZ%"
IsMatch("%", "?Y%") // returns true because "%" matches a superset of "?Y%"
您可以检查
input
是否确实与
pattern
生成的字符串子集匹配,只要

  • 你真的可以把自己限制在%和?指定的操作员
  • 您的输入/模式字符串相当短-更具体地说,输入或模式中%的出现次数少于20左右
基本思想是为
input
生成一个代表性字符串列表,并使用您最喜欢的正则表达式引擎将每个字符串与模式匹配。如果所有代表匹配-
输入
匹配
模式的子集
IsSubset
的此算法可描述如下

let c = some character not in `pattern` (lexically speaking)
let searchString = replace all occurences of '?' in input with c
add searchString to setOfSearchStrings
foreach occurence of '%' in input
    foreach str in setOfSearchStrings
        replace str with two strings - {str with c in place of '%', str without the '%'}

foreach str in setOfSearchStrings
   if str doesn't "regex" match with pattern 
       return false

return true
例如,如果输入为?X%YZ%,且
模式不包含字符A,则生成的列表将为
AXYZ
AXYZA
AXAYZ
阿克萨扎

很容易看出,此列表中的字符串数为2^n,其中n是输入中“%”的数目

此外,交换参数的顺序并以相反的方式找出它们之间的关系也很容易。所以实际上你的

IsMatch(input,pattern) = IsSubset(input,pattern) || IsSubset(pattern,input)

你怎么估计这些匹配?X和Y匹配,即%(通常在数据库中使用的通配符,但不在正则表达式中使用)与输入的其余部分(Z5%)匹配,但在此之后,您的搜索模式要求输入中找不到HH?123。或者,您是否认为输入端的通配符与这些匹配?这使得您的问题“这些正则表达式是否都有一个可以匹配的输入?”很难回答。@SQB
XY
两个都匹配,
Z5
在第一个中由
%
在第二个中匹配,
HH?123
在第二个中由
%
在第一个中匹配。有点双向匹配。@iamnotmaynard是的,我很害怕。正如我所说,这就产生了一个真正的问题“这两个正则表达式是否有任何输入都可以匹配?”@SQB输入字符串存储在数据库中,我提取并与搜索/模式字符串进行比较。我们的期望是,在我的应用程序UI中,如果用户使用此搜索/模式字符串进行搜索,我的应用程序(C#.net)应该匹配从DB获取的此输入字符串,并将此输入字符串显示给用户。您必须清楚地定义所使用的模式匹配语言(或指向联机内容)并给出一些搜索模式和各种输入——并解释为什么它被认为是匹配的或不匹配的。只有到那时,才有人能告诉你是否可以用regexps实现。嗨,霍克,非常感谢你分享你的想法并提供详细的解释。这是一个非常好的想法,肯定会帮助我思考这个方向的解决方案。