有没有人遇到Java版的Google正则表达式库RE2或具有类似功能和良好性能的Java库?性能要求是关于正则表达式的长度和输入文本长度的线性时间.
大多数正则表达式实现使用回溯算法来匹配输入文本,因此在一些简单的正则表达式上是指数式的(.*).(.*).(.*).(.*).RE2是谷歌的一个库,它通过使用一种算法来解决这个问题,该算法使用自动机理论的概念与输入大小线性变化.提问者想要知道是否存在基于该算法的Java库.
我刚刚发现http://code.google.com/p/re2,使用一个长期被忽视的方式(一个有前途的库汤普森NFA)来实现正则表达式引擎,可以是数量级比AWK的可用引擎更快,Perl或Python.
所以我下载了代码并做了平常的sudo make install事情.然而,这个动作似乎只是添加/usr/local/include/re2/re2.h到我的系统.似乎有一些``` .afile in addition, but then what is it with this .a``扩展名?
我想使用Python中的re2(最好是Python 3.1)并很高兴看到像make_unicode_groups.py发行版中的文件(可能只是在构建过程中使用?).然而,那些没有部署在我的机器上.
我如何使用Python的re2?
更新两个友好的人已经指出,我可以尝试从源代码构建DLLs/*.so文件,然后使用Python的ctypes库来访问它们.任何人都可以提供有用的指示如何做到这一点?我在这里几乎一无所知,尤其是第一部分(构建*.so文件).
更新我也张贴了这个问题(前面)的RE2开发者群体,没有回答到现在(这是一小群),今天的(有些人口较多)comp.lang.py组[-thread这里- ].希望来自不同角落的人们可以相互联系.我的猜测是技术娴熟的人可以在他们的20%你的免费时间属于谷歌太时间片的几个小时内做到这一点; 这会让我筋疲力尽.是否有一个工具可以自动将C++愚蠢地转换为Python需要能够连接的任何C语言?然后可能会得到一个可行的结果可以简化为聪明的工具链.
(咆哮)为什么这么难?认为在2010年我们仍然不能拥有我们丰富的软件,只是互相交谈.这是一个障碍,每当你想要从Python处理一些C代码时,你必须总是抓住这些链接位.这需要大量工作,但只提供特定于C代码版本和Python版本的扩展模块,因此它可以快速老化.(/ rant) 是否可以在不同的进程中运行这些东西(如果我有一个re2可执行文件,可以产生数据的结果,比如说,subprocess/Popen/communicate())?(这不应该是一个纯粹的命令行工具,就必须在每次需要时的处理的开口,但连续运行的单个PROCESSS;也许存在包装之类的"丑化"这样的C代码).
假设我有一个具有类似值的列
foo/bar
chunky/bacon/flavor
/baz/quz/qux/bax
Run Code Online (Sandbox Code Playgroud)
即,由"/"分隔的可变数量的字符串.
在另一列中,我希望从"/"中分割后,从每个字符串中获取最后一个元素.所以,该专栏将有
bar
flavor
bax
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这一点.我可以拆分"/"并得到一个数组,我可以看到函数"index"从数组中获取一个特定的编号索引元素,但是找不到在这个函数中说"最后一个元素"的方法.
这个 Github 存储库将 std::regex 添加到正则表达式引擎列表中,但被其他引擎淘汰了。
为什么 std::regex - 在 libstdc++ 中实现 - 比其他的慢得多?这是因为 C++ 标准要求还是只是特定的实现没有得到很好的优化?
同样在枪战中,即使添加了 std::regex::extended 标志,std::regex 也无法编译所有其他人都接受的几个正则表达式。他们是(?i)Twain、、、、和。\b\w+nn\b(?i)Tom|Sawyer|Huckleberry|Finn\s[a-zA-Z]{0,12}ing\s([A-Za-z]awyer|[A-Za-z]inn)\s\p{Sm}
更新:添加了与 boost::regex 的比较。
UPDATE2:添加了ctre
我正在寻找适用于 Google Big Data (RE2) reg 表达式的正则表达式测试器。那里有一些测试人员,但他们似乎都不明白我的说法。这些是我尝试过的,它们适用于简单的表达式,但不适用于我的:
这是我的正则表达式:
^(?:1-)?((?:R|RO|Ro)?[:|.]?\\s?\\d{3}[-|.]?\\d{4}[-|/]F\\d{2}-\\d{2})$
我将在其中处理这样的字符串:
有谁知道我如何输入不同的语句或者我可以在哪里测试它?
因为我对re2有点新意,所以我试图弄清楚如何(?=regex)在Go中使用JS,C++或任何PCRE风格的正面观察.
以下是我正在寻找的一些例子.
JS:
'foo bar baz'.match(/^[\s\S]+?(?=baz|$)/);
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
re.match('^[\s\S]+?(?=baz|$)', 'foo bar baz')
Run Code Online (Sandbox Code Playgroud)
'foo bar '非常感谢.
如何在 RE2 中为“匹配字符串不以 4 或 5 开头”编写正则表达式?
在 PCRE 中我会使用^(?!4)但 RE2不支持该语法。
我正在尝试A1使用Google表格正则表达式公式获取给定字符串中连字符前面的所有数字列表(假设在单元格中):
=REGEXEXTRACT(A1, "\d-")
Run Code Online (Sandbox Code Playgroud)
我的问题是它只返回第一场比赛...... 我怎么能得到所有的比赛?
示例文字:
"A1-Nutrition;A2-ActPhysiq;A2-BioMeta;A2-Patho-jour;A2-StgMrktg2;H2-Bioth2/EtudeCas;H2-Bioth2/Gemmo;H2-Bioth2/Oligo;H2-Bioth2/Opo;H2-Bioth2/Organo;H3-Endocrino;H3-Génétiq"
Run Code Online (Sandbox Code Playgroud)
我的公式返回1-,而我想得到1-2-2-2-2-2-2-2-2-2-3-3-(作为数组或连接文本).
我知道我可以使用脚本或其他函数(如SPLIT)来实现所需的结果,但我真正想知道的是如何在REGEX.*"Google表格公式"中获得re2正则表达式以返回这样的多个匹配.有点像" G ^ -叶形不要返回第一场比赛后,在"选项regex101.com
我也尝试删除不需要的文本REGEXREPLACE,但没有成功(我无法摆脱不在连字符之前的其他数字).
任何帮助赞赏!谢谢 :)
考虑以下玩具示例.我想在Go中使用正则表达式匹配,其中名称是a由单个分隔的字母序列#,因此a#a#aaa是有效的,但是a#或a##a不是.我可以通过以下两种方式编写正则表达式:
r1 := regexp.MustCompile(`^a+(#a+)*$`)
r2 := regexp.MustCompile(`^(a+#)*a+$`)
Run Code Online (Sandbox Code Playgroud)
这两项都有效.现在考虑更复杂的匹配由单斜杠分隔的名称序列的任务.如上所述,我可以用两种方式编写代码:
^N+(/N+)*$
^(N+/)*N+$
Run Code Online (Sandbox Code Playgroud)
其中N是带有^和$ stripped的名称的正则表达式.由于我有两个N的情况,所以现在我可以有4个正则表达式:
^a+(#a+)*(/a+(#a+)*)*$
^(a+#)*a+(/a+(#a+)*)*$
^((a+#)*a+/)*a+(#a+)*$
^((a+#)*a+/)*(a+#)*a+$
Run Code Online (Sandbox Code Playgroud)
问题是为什么当匹配字符串时"aa#a#a/a#a/a"第一个失败而其余3个案例按预期工作?是什么导致第一个正则表达式不匹配?完整的代码是:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "aa#a#a/a#a/a"
regs := []string {
`^a+(#a+)*(/a+(#a+)*)*$`,
`^(a+#)*a+(/a+(#a+)*)*$`,
`^((a+#)*a+/)*a+(#a+)*$`,
`^((a+#)*a+/)*(a+#)*a+$`,
}
for _, r := range(regs) {
fmt.Println(regexp.MustCompile(r).MatchString(str))
}
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是它打印 false true true true
我正在尝试在 Google 表格上的正则表达式中筛选双引号,但没有运气。A1 单元格文本 =some "name"
我的公式
=REGEXEXTRACT(A1;"\"(.*)\"")
Run Code Online (Sandbox Code Playgroud)
但是 Google Docs 认为我使用引号作为打开/关闭参数。请帮忙。
GoogleDocs 用于正则表达式的库是 re2
re2 ×10
regex ×10
go ×2
benchmarking ×1
c++ ×1
google-docs ×1
java ×1
libstdc++ ×1
python ×1
split ×1