- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 c
程序,我无法让正则表达式匹配按照我想要的方式工作。基本上,我想匹配 testStr
中的第一个字符(W 或 M)和日志文件的名称作为第二个匹配项 (TESTY.LOG)。这是我目前所拥有的:
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#define MAX_MATCHES 2
.....
char testStr[20]="W TESTY.LOG ";
char temp[100];
int reti;
regex_t regex;
regmatch_t matches[MAX_MATCHES];
int i;
int numchars;
/* Compile regular expression */
reti = regcomp(®ex, "^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$", REG_EXTENDED);
/* Execute regular expression */
reti = regexec(®ex, testStr, MAX_MATCHES, matches, 0);
if (!reti) {
for (i=0; i < MAX_MATCHES; i++) {
numchars = (int)matches[i].rm_eo - (int)matches[i].rm_so;
strncpy(temp,testStr+matches[i].rm_so,numchars);
temp[numchars] = '\0';
}
}
当我在 gdb 中运行它时,我看到以下匹配项:
(gdb) 显示匹配
1: 匹配 = {{rm_so = 0, rm_eo = 15}, {rm_so = 0, rm_eo = 1}}
2: temp = "W TESTY.LOG"
和
2: temp = "W"
所以,我得到第一个字符 OK,但我没有得到第二个匹配项的日志文件名。我在 perl 中使用正则表达式,但我是 ansi c 中的正则表达式的新手。我觉得我在这里缺少一些基本的东西。
最佳答案
匹配 0 是整个正则表达式匹配的字符串部分(Perl 的 $&
)。 Match i for i> 0是匹配捕获号i对应的部分,同Perl的$1,$2, ...
。你有两次捕获,所以你应该期待三场比赛。但是您将 MAX_MATCH 指定为 2,因此最后一个匹配项将被丢弃。
还有正则表达式
^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$
有点奇怪。我认为您应该重新阅读有关正则表达式中字符类的文档——在这种情况下,它在 Perl 中与在 Posix 扩展 RE 中相同。 [W|M]
匹配 W、| 或 M 这三个字符中的任何一个。类似地,[A-Z|0-9|\.]{1,}
匹配一个或多个字母、数字、字符 | 或字符 ..
反斜杠是无关紧要的,因为它只对字符串文字中的 . 进行转义,而无需进行转义。如果您编译时启用了警告,-Wall
,您的 C 编译器可能会警告您转义序列不合法。如果您实际上已将反斜杠传递给正则表达式库,它会将其解释为字符类的另一个可能匹配项。
此外,{1,}
在 Perl 和 Posix Extended RE 中都可以方便地写成 +
。
简而言之,您可能想要的是:
reti = regcomp(®ex, "^([WM])[[:space:]]([A-Z0-9.]+)[[:space:]]*$", REG_EXTENDED)
你也可以使用
reti = regcomp(®ex, "^([WM])[[:space:]]([[:alnum:].]+)[[:space:]]*$", REG_EXTENDED)
关于c语言正则表达式匹配字符串的多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52408419/
我正在用 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 最
我是一名优秀的程序员,十分优秀!