- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建一个正则表达式,我们可以在其中检查某个引用集中出现的所有字母是否出现在其他某个字符串中,但仅限于奇数(1、3、5、...)。
这是 DFA 的(非常)粗略的图像表示问题:
我开始使用有限集 {a, b}
,所以我基本上会检查“是否同时存在奇数个 a
和奇数个b
在字符串中?"
不幸的是,我自己并没有走多远。我第一次阅读this thread ,这与这个概念非常相似,但无法从 (aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab| ba)(bb|aa)*a)
。 (我了解它是如何工作的,但不知道如何将其转换为检查 两个 项目的奇数。)
这是我到目前为止的想法:^((ab|ba)(bb|aa)?|(bb|aa)?(ab|ba) )+$
。这基本上检查是否有 ab
或 ba
后跟 bb
或 aa
或什么都没有,这将导致 ab
、ba
、abaa
、abbb
、baaa
或 babb
。 (它也做相反的事情,首先检查双字母。)然后可以无限期地重复。我遇到的问题是,如果不匹配 bbaa
,我似乎无法调整它以匹配字符串 bbaaba
。
此外,上面的方法不能动态调整以说明 {a, b, c}
,例如,尽管我愿意放弃这个来解决最初的问题。
这是我的测试字符串和期望的输出,括号中是原因:
"ba" # True (1a, 1b)
"abbb" # True (1a, 3b)
"bbba" # True (1a, 3b)
"bbab" # True (1a, 3b)
"ababab" # True (3a, 3b)
"bbaaba" # True (3a, 3b)
"abb" # False (2b)
"aabb" # False (2a, 2b)
"aabba" # False (2b)
"" # False (0a, 0b is "even")
"a" # False (0b is "even")
"b" # False (0a is "even")
那么,这可以通过正则表达式实现吗?还是正则表达式比 DFA 更受限制?我知道它可以通过一个基本循环来完成,但这不是我想要的。
最佳答案
正则表达式并不比 DFA 更受限制;事实上,它们是等价的。 (具有反向引用的 Perl 风格的“正则表达式”严格来说更强大,所以它们根本不是“常规”的。)
如果字符串只包含a
,我们可以轻松编写正则表达式小号:
a(aa)*
如果中间还可能出现其他字母,我们仍然可以通过简单地忽略这些字符来实现:
[^a]*a([^a]*a[^a]*a)*[^a]*
因为正则表达式等同于 DFA,所以我们对每个单独的字母都有一个 DFA。其实很简单:
[^a] _ [^a] _
/ \ / \
| v a | v
---> (0) -----> ((1))
<-----
a
状态 (0) 是起始状态(“偶数个 a
已看到”),状态 ((1)) 是唯一的接受状态(“奇数个 a
已看到”)。如果我们看到 a
,我们去另一个州;对于任何其他角色,我们保持相同的状态。
DFA 的好处在于它们可组合。特别是,它们在交叉路口下是封闭的。这意味着,如果我们有一个识别语言“包含奇数个 a
的字符串”的 DFA,另一个识别语言“包含奇数个 b
的字符串”的 DFA,我们可以将它们组合起来到识别这两种语言交集的 DFA,即“包含奇数个 a
和奇数个 b
的字符串”。
我不会详细介绍算法,但 this question有一些很好的答案。生成的 DFA 将有四种状态:“看到偶数个a
,看到偶数个b
”,“看到偶数个a
,看到奇数个b
”,等等。
并且由于 DFA 等同于正则表达式,因此还存在一个与这些字符串精确匹配的正则表达式。同样,我不会详细介绍算法,但是 here is an article这很好地解释了它。方便的是,它还附带了一些 Python 3 代码来完成肮脏的工作:
>>> from fsm import fsm
>>> a = fsm(
alphabet = {'a', 'b'},
states = {0, 1, 2, 3},
initial = 0,
finals = {3},
map = {
0: {'a': 1, 'b': 2},
1: {'a': 0, 'b': 3},
2: {'a': 3, 'b': 0},
3: {'a': 2, 'b': 1}
}
)
>>> str(a.lego())
'a*(ab|b(ba*b)*(a|ba+b))((a|ba+b)(ba*b)*(a|ba+b)|ba*b)*'
库中可能存在错误,或者我使用错误,因为 a*
一开始不可能是对的。但您明白了:虽然理论上可行,但您真的不想为此使用正则表达式!
关于python - 我们可以使用正则表达式来检查每种类型的字符是否为奇数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431326/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!