【问题标题】:Regular expressions with scanf in CC中带有scanf的正则表达式
【发布时间】:2016-12-29 12:28:12
【问题描述】:

我正在尝试实现以下目标,但没有成功:

去除开口

消息“

和尾随

"

同时将内容保留在中间,并将其保存到我的变量中,使用 sscanf 正则表达式。 我写了以下代码:

sscanf( buffer, "message \"%[^\"]", message)

当我有类似消息“嘿,那里”之类的东西时效果很好,但是当我尝试以下字符串时,我只得到两个引号之间的空格。

消息“”“”这是一个测试“”“”

结果应该是“”“这是一个测试”“”

有没有办法升级我的表达,让它包含这个极端的消息事件?我试图在谷歌和这里查找它,但找不到一个优雅的答案。我知道可以使用带有很多代码行的字符串操作,但我在这里尝试更简单的方法。

附注结尾的 " 是表达式的结尾,是程序必须的,之后什么都没有。

提前感谢您的反馈!

【问题讨论】:

  • 后面的"后面会有什么吗?
  • 如果不是,您可以使用. 而不是[^\"]
  • 不,后面的“是整个表达式的结尾。
  • @Fallenhero sscanf( buffer, "message \"%. ", message) ?这似乎不对
  • @BoazKG 你需要知道规范。是的,在 message " 之后阅读所有内容,然后检查最后一个字符是否为 " 会起作用。

标签: c regex string scanf


【解决方案1】:

如果您对整个事情不使用正则表达式感到满意:

原版:

sscanf(buffer, "message \"%[^$]", message); // remove 'message "'
message[strlen(message) - 1] = '\0'; // remove trailing '"'

安全、正确、通用的版本:

char* buffer = ...;
const char* prefix = "message \"";
const char* suffix = "\"";

if (strstr(buffer, prefix) != buffer) {
    // error, doesn't start with `prefix`
}

buffer += strlen(prefix);

char* suffixStart = strrchr(buffer, suffix[0]);
if (!suffixStart || strcmp(suffixStart, suffix) != 0) {
    // error, doesn't end with `suffix`
}

*suffixStart = '\0'; // strip `suffix`

【讨论】:

  • 如果消息不够大,此代码会出现缓冲区溢出,如果 strlen(message)==0 并且可能根本没有读取消息,则会出现未定义的行为。
  • 扫描集中的字符并不是真正的正则表达式。显示的格式无法正确解析message "send $20 immediately";它将停在 $ 符号处。
  • @WernerHenze 已修复。
  • 好多了。请注意,scanf() 格式中的空格正式匹配零个或多个空格字符。您的strstr() 公式并没有完全做到这一点,但它可能是可以原谅的。 scanf() 家族是无休止的微妙,经常令人恼火。
  • strstr() 的这种用法看起来像 strncmp()
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多