- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
正则表达式模式需要匹配以下内容:
abc_xyz_0
abc_1025_01.29.00_xyz_0
abc_0302_42.01.00_xyz_0
(abc 和 xyz 之间的数字无关紧要)
所以我解析为:
(abc_(\w+\.\d+\.\w+)?xyz_0)
我的代码:
regex_t r;
unsigned int maxGroups = 3;
regmatch_t groupArray[maxGroups];
char * to_match = "abc_0302_02.01.00_xyz_18 abc_0302_02.01.00_xyz_16 abc_0302_02.01.00_xyz_14 abc_0302_02.01.00_xyz_0 abc_0302_02.01.00_xyz_10 abc_0302_02.01.00_xyz_2"
if (0 != regcomp(&r, "(abc_(\\w+\\.\\d+\\.\\w+)?xyz_0)", REG_EXTENDED))
{
//this does NOT get hit
printf("regcomp failed")
}
else if(regexec(r, to_match, maxGroups, groupArray, REG_EXTENDED) == 0)
{ *never gets here* }
else
{ printf("regexec returned non-zero(No Matches)\n"); }
regfree(&r);
所以我的猜测是我有错误的正则表达式(这对我上面定义的情况工作正常 - 我使用 regexpal.com 来确认),或者我遗漏了什么?
无论哪种方式,我都知道我很接近并且非常感谢一些帮助。
最佳答案
您复制到问题中的代码中有几个拼写错误(见下文),您应该只传递 REG_EXTENDED
至 regcomp
;唯一的标志 regexec
识别为 REG_NOTBOL
和 REG_NOTEOL
. (有关详细信息,请参阅 regexec
manpage。)
但是,问题是 Posix 正则表达式(包括 Gnu 实现)没有实现非标准转义序列 \d
.如 regex(7)
manpage 中所示, 模式可以包括:
a '\' followed by one of the characters "^.[$()|*+?{\" (matching that character taken as an ordinary character),
或
a '\' followed by any other character (matching that character taken as an ordinary character, as if the '\' had not been present)
请注意,\
的唯一效果, 在任何一种情况下,都会导致后面的字符作为普通字符进行匹配。虽然 regcomp
的 Gnu 实现确实识别 \w
作为一个字符类,Posix 不需要这种行为,其他实现可能不会这样做。 (它也没有记录,所以它可能并不总是有效。)而且它不识别 \d
.
如果您使用的是 Posix 正则表达式,则应使用 Posix 标准字符类,因此正则表达式字符串应为:
"(abc_([[:alnum:]_]+\\.[[:digit:]]+\\.[[:alnum:]_]+)?xyz_0)"
您将在上一个链接的正则表达式联机帮助页中找到 Posix 命名字符类的列表(或者如果您已经安装了标准库文档,则键入 man 7 regex
,强烈推荐这样做。)
在 char * to_match =...
末尾添加缺少的分号后,我用您的代码验证了这一点和改变r
至 &r
在调用 regexec
.
请注意,很少有在线正则表达式资源实现了 Posix 正则表达式规范; http://regexpal.com ,例如,仅提供 PCRE 和 Javascript 样式正则表达式的选项。
每次调用regexec
, 根据 man 7 regex
中描述的固定算法,您将获得传递给它的字符串中的第一个匹配项:
In the event that an RE could match more than one substring of a given string, the RE matches the one starting earliest in the string. If the RE could match more than one substring starting at that point, it matches the longest. Subexpressions also match the longest possible substrings, subject to the constraint that the whole match be as long as possible, with subexpressions starting earlier in the RE taking priority over ones starting later. Note that higher-level subexpressions thus take priority over their lower-level component subexpressions.
如果你想在同一个字符串中找到一个模式的多个实例,你需要调用regexec
在一个循环中。每次通过循环,您都会给它上一个匹配项(即 string + matches[0].rm_eo
)的第一个不匹配字节的地址,直到它报告不再有匹配项为止。如果你依赖^
匹配中的 anchor ,您需要传递 REG_NOTBOL
的正确值标记每次调用 regexec
.
关于C - regexec 返回 NOMATCH - 即使它应该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42149031/
我在这里有这个脚本: angular.module('UserValidation', []).directive('validPasswordC', function () { return
正则表达式模式需要匹配以下内容: abc_xyz_0 abc_1025_01.29.00_xyz_0 abc_0302_42.01.00_xyz_0 (abc 和 xyz 之间的数字无关紧要) 所以我
我有两个输入文件,每个文件的长度为 5200 字节。一个七字节的键用于比较两个文件,如果匹配,则需要将其写入“匹配”文件,但在写入匹配文件时,我需要来自 infile1 的一些字段。以及来自 infi
我使用此代码进行密码输入并确认密码输入正确匹配 Javascript: var app = angular.module('app', []); app.directive('validPas
请帮助我解决为什么我在提到评论人员时遇到错误。我真的被困在这里了!我还应该提供哪些其他详细信息? main.cpp #include #include #include int main() {
除了这一行,我的代码有效 .FindFirst "[DONOR_CONTACT_ID] = strTemp2" 我希望我的代码检查是否有记录,其中存在特定的 DONOR_CONTACT_ID,因为有多
我正在使用数据,表 1.9.4 和 R 3.1.2 平台:x86_64-pc-linux-gnu(64 位)。 ':=' 功能中的 nomatch 参数似乎不起作用。以下是示例代码 library(d
我有一个名为 df 的数据框看起来像这样...... "ID","ReleaseYear","CriticPlayerPrefer","n","CountCriticScores","CountUse
查看下面的以下代码行。 Dim rst As DAO.Recordset Dim strSql As String strSql = "SELECT * FROM MachineSettingsT;"
我是一名优秀的程序员,十分优秀!