正则expression式使用Vala和GLib

有没有一个函数,像http://php.net/manual/en/function.preg-match-all.php ?

使用GLib http://references.valadoc.org/#!api=glib-2.0/GLib.MatchInfo ,所有我find的是:

public bool match_all_full (string str, ssize_t string_len = -1, int start_position = 0, RegexMatchFlags match_options = 0, out MatchInfo match_info = null) throws RegexError Using the standard algorithm for regular expression matching only the longest match in the string is retrieved, it is not possible to obtain all the available matches. 

并说它不可能获得所有可用的匹配。

我无法find任何有效的代码示例。 谢谢你的帮助。

注意:

目标是parsing一个plist文件(我只需要CFBundleIdentifier和CFBundleName值)

 <?xml version="1.0" encoding="UTF-8"?> <plist version="1.0"> <dict> <key>CFBundleIdentifier</key> <string>nodejs</string> <key>CFBundleName</key> <string>Node.js</string> <key>DocSetPlatformFamily</key> <string>nodejs</string> <key>isDashDocset</key><true/><key>dashIndexFilePath</key><string>nodejs /api/documentation.html</string></dict> </plist> 

我有这些依赖availabes(Ubuntu的突触包):

 Build-Depends: debhelper (>= 9), dh-autoreconf, gnome-common, valac (>= 0.16.0), libzeitgeist-2.0-dev (>= 0.9.14), libdbus-glib-1-dev, libgtk-3-dev (>= 3.0.0), libglib2.0-dev (>= 2.28.0), libgee-0.8-dev (>= 0.5.2), libjson-glib-dev (>= 0.10.0), libkeybinder-3.0-dev, libnotify-dev, librest-dev, libappindicator3-dev (>= 0.0.7) 

作为一个结果,它给了我

 ** Message: main.vala:28: CFBundleIdentifier: cakephp ** Message: main.vala:28: CFBundleName: CakePHP ** Message: main.vala:28: DocSetPlatformFamily: cakephp 

为什么不使用xmllib? 在GNU系统(尽pipe我是一个新手),项目有很less依赖,程序打包假设只有某些依赖项,如果我要我的插件被使用,我想我只能使用可用的依赖关系或我可能会破坏一些东西,阻止最后的更新。

首先,让我们看看你引用的引用的一些上下文,重点还有:

使用标准算法进行正则表达式匹配时,只检索字符串中最长的匹配项, 不可能获得所有可用的匹配项 。 例如,将“ <a> <b> <c> ”与模式“ <.*> ”匹配,可以得到“ <a> <b> <c> ”。

该函数使用不同的算法 (称为DFA,即确定性有限自动机),因此它可以检索所有可能的匹配,全部从字符串中的相同点开始。 例如,将“ <a> <b> <c> ”与模式“ <.*>; ”匹配<.*>; “您将获得三个匹配:” <a> <b> <c> “,” <a> <b> “和“ <a> ”。

这就是说,这不是你正在寻找的“全部” – 你的情况要简单得多。 所有你需要做的是迭代通过标准算法的匹配:

 private static int main (string[] args) { string contents; GLib.Regex exp = /\<key\>([a-zA-Z0-9]+)\<\/key\>[\n\t ]*\<string\>([a-zA-Z0-9\.]+)\<\/string\>/; assert (args.length > 1); try { GLib.FileUtils.get_contents (args[1], out contents, null); } catch (GLib.Error e) { GLib.error ("Unable to read file: %s", e.message); } try { GLib.MatchInfo mi; for (exp.match (contents, 0, out mi) ; mi.matches () ; mi.next ()) { GLib.message ("%s: %s", mi.fetch (1), mi.fetch (2)); } } catch (GLib.Error e) { GLib.error ("Regex failed: %s", e.message); } return 0; }