生成与正则表达式匹配的字符串的C#代码

9

我使用正则表达式来验证用户输入。现在我可以配置正则表达式,以便帮助用户查看某些输入应该格式化的示例。

是否有可能生成与任意正则表达式匹配的字符串?是否有可用的实现?

更新: 由于许可证的限制,我不能使用REX。还有其他可能性吗?


1
我建议你看一下这个网站:http://research.microsoft.com/en-us/projects/rex/,他们做了类似的事情。如果对你有用,请告诉我。 - Ron.B.I
1
请查看此网站:http://debuggex.com。输入任何您想要的正则表达式,然后查看“一些随机匹配项”部分。当您的正则表达式开始变得复杂时,您可能会对所提出的建议感到惊讶。 - Stephan
.* 可以生成什么? - Toto
根据选项的不同,可以选择除换行符以外的所有内容或者全部内容。 - Joey
4个回答

8

Rex很酷,但由于许可证的限制,我无法使用它。 - schoetbi
1
@schoetbi 我找到了这个https://github.com/moodmosaic/Fare ,它是C#中xeger的包装器,你可以试试这个 :) - Kamil Budziewski
票价看起来不错,它包括一个 Xeger 端口。我会试一试。 - schoetbi

2

一些解决方案:

(1) 如果正则表达式是由您编写的(而不是用户),并且很少更改,为什么要编写任何程序呢?您可以手动创建一些漂亮的示例。

(2) 使用现成的解决方案。(请参见其他答案)

(3) 拒绝抽样,解决所有随机生成问题的万能方法:创建一个随机字符串并检查它是否与正则表达式匹配。如果不匹配,请重试。但是,如果正则表达式非常特定,则此解决方案的性能非常糟糕。

(4) 实现一个解析器,将正则表达式转换为字符串构造树,该树由以下节点组成。每个节点都有一个CreateRandomString方法,遵循某些规则。创建随机字符串意味着为根节点调用该方法。

连接:遍历所有子树并按顺序连接结果。

随机选择:选择一个随机子树并遍历它。返回结果。

乘法:创建介于a和b之间的随机数字n。遍历子树n次并连接结果。

叶子:返回一个常量字符串。

创建解析器是棘手的部分: ),特别是嵌套结构。(我已经为类似于正则表达式的语法编写过一个。)


我曾经考虑过数字4,因为.NET框架的正则表达式解析器是纯托管的。但后来我发现了一个很好用的工具。这个正则表达式会不断变化,而且有多个版本,用户也可以进行配置(尽管不是最终用户);) - schoetbi

1
根据评论中的说明,Rex工具可以解决问题 -
使用Rex创建与您的模式匹配的字符串:
运行rex.exe,如下所示:
rex.exe "your_regex_pattern_here" /k:your_required_examples_num_here

更多关于此的信息:Rex Guide

0

几乎可以肯定不是这样的。

正则表达式通常用于检查字符串是否符合给定格式,如果您知道您的格式足够好,以至于您正在为其编写正则表达式,那么您应该很容易地生成自己的测试数据。

[编辑-似乎有一些例子。但是这忽略了一个事实,即要测试您的正则表达式是否正确,您必须已经编写了测试数据。因此,您应该已经拥有您的字符串。]


我认为在.NET中应该有一个类似于regexparser的类,而不是检查规则,选择正则表达式中每个标记的有效字符示例并将其附加到示例字符串中应该是可能的。 - schoetbi
在你所描述的情况下,你正在提供用于验证数据的表达式。因此,你肯定已经知道了这些数据,才能够首先编写出这些表达式? - Adrian Wragg
用户尚未输入要匹配的字符串。我想向他展示有效的例子。 - schoetbi
但是,如果您没有已经想好的有效示例,您如何编写正则表达式呢?为什么不向他展示这些呢?毕竟这是您自己的应用程序。 - Adrian Wragg
我有这个想法,因为它们是必须遵循特定模式的零件号码。用户可以为他的零件选择自己的编号,但必须遵守该模式。 - schoetbi
我仍然不明白为什么你要让事情变得更加困难,当你自己已经掌握了模式的知识并且可以访问完全有效的样本值。你还面临着例如示例中出现亵渎语言的风险。 - Adrian Wragg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接