ai didi

ruby - 提取带和不带终止字符的文件名

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:21 24 4
gpt4 key购买 nike

我有一个包含以下文本之一的字符串:

  1. 内联;文件名="名称.扩展名";
  2. 内联;文件名="名称.扩展名"
  3. 内联; filename='name.extension';
  4. 内联;文件名='name.extension'
  5. 内联;文件名=名称.扩展名;
  6. 内联;文件名=文件名.扩展名

我想提取 name.extension 并且可以处理前 5 种情况,但我不知道如何使用单个正则表达式处理所有情况。我尝试的一切都变得太贪婪了。这可能吗?

适用于前 5 个的正则表达式是:

/filename=["']?(.*)(?=["']?;)/

name.extension 位于第一个捕获组中,并且必须允许 linux 中文件名的任何有效字符。其中包括 ' 和 "和 ;。

感谢您的帮助!

最佳答案

分三个阶段进行。

  1. 拆分 ;将语句分开。
  2. = 上拆分键/值对.
  3. 处理值的引用。

这是一个基本示例。

def get_value(line)
# Split into statements
statements = line.split(/\s*;\s*/)

# Extract the value of the 2nd statement
_,value = statements[1].split(/\s*=\s*/)

# Strip the quotes
value.gsub!(/^(['"]?)(.*)\1$/, '\2')

return value
end

有一些边缘情况无法处理:如果您感兴趣的陈述不是第二个怎么办?但这可以根据需要进行修复。如果通过多个步骤完成解析,而不是试图将其塞进一个正则表达式,那么改进解析要容易得多。

例如,这可以正确处理嵌入引号和转义引号,如 %q[inline; filename="name's.extension"]%q[inline; filename="name's.\\"extension\\""] .


如果你真的想把它作为一个正则表达式来做,好吧,你自找的。

re = /
\bfilename
\s*=\s*
(?:
(?<quote>['"])(?<value>.*)\k<quote> |
(?<value>[^;]+)
)
/x
return re.match(line)['value']

这将扩展的处理分为两种选择:一种带引号,一种不带引号。否则filename=name.ext;将拿起分号,我想不出另一种不会引入新问题的方法来阻止它。

例如,/\bfilename\s*=\s*(?<quote>['"]?)(?<value>.*?)\k<quote>;?$/将处理测试数据,但如果分号后有任何内容,如 %q[inline; filename='name.extension'; foo],它将失败.

您询问了专业的正则表达式知识。成为正则表达式专家的一部分是知道什么时候不应该使用正则表达式。这可能应该用语法来处理,否则您将不断地追逐边缘情况。

关于ruby - 提取带和不带终止字符的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42355668/

24 4 0
文章推荐: ruby-on-rails - Rails local_assign 与局部变量
文章推荐: Ruby:即时值(value)支票?
文章推荐: ruby-on-rails - NameError:未初始化的常量 Rails::TestTask
文章推荐: ios - 从命令行为 iOS 应用程序运行单独的 XCTest(UI、单元)测试用例
数据小太阳
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com