- 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/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!