当前位置: 首页 > 知识库问答 >
问题:

Amazon S3对象名称的正则表达式

黄毅
2023-03-14

从aws文档https://docs.aws.amazon.com/amazons3/latest/dev/usingmetadata.html中,我们知道允许作为对象名称一部分的字符。我想构建一个正则表达式,它应该指定一个对象或一组对象,如下所示:

/abc/obj*
/abc/*
/*
/abc/obj1.txt

我创建的正则表达式如下所示:

"((/[a-zA-Z0-9]+)*((/[a-zA-Z0-9\\.]*(\\*)?)?))"

除了需要添加在方括号内的附加符号之外,这个正则表达式看起来不错还是需要一些更多的增强或简化?

共有1个答案

司马昕
2023-03-14

首先,您的regex不太好用。例如,对于/abc/obj.txt,它无法匹配.txt部分。查看您的regex的演示。其次,在子表达式[a-za-z0-9\\.]中,不需要反斜杠字符;.将被解释为没有它们的句点字符。第三,在regex的开头应该有^,在regex的结尾应该有$,以确保匹配所需内容,并且输入中没有任何无关内容。第四,您没有指定正在使用的语言。

这里我使用的是Python:

import re

tests = [
    '/abc/obj*',
    '/abc/*',
    '/*',
    '/abc/obj1.txt'
]

# the regex: ^/([a-zA-Z0-9]+/)*(\*|([a-zA-Z0-9]+(\*|(\.[a-zA-Z0-9]+)?)))$

for test in tests:
    m = re.match(r"""
        ^                   # the start of the string
        /                   # a leading /
        ([a-zA-Z0-9]+/)*    # 0 or more: abc/
        (\*                 # first choice: *
        |                   # or
        ([a-zA-Z0-9]+       # second choice: abc followed by either:
            (\*|(\.[a-zA-Z0-9]+)?)))    # * or .def or nothing
        $                   # the end of the string
        """, test, flags=re.X)
    print(test, f'match = {m is not None}')

印花:

/abc/obj* match = True
/abc/* match = True
/* match = True
/abc/obj1.txt match = True
^[a-zA-Z0-9!_.*'()-]+(/[a-zA-Z0-9!_.*'()-]+)*$

Regex演示

新代码:

import re

tests = [
    'abc',
    '-/abc/(def)/!x*yz.def.hij'
]

# the regex: ^[a-zA-Z0-9!_.*'()-]+(/[a-zA-Z0-9!_.*'()-]+)*$

for test in tests:
    m = re.match(r"""
        ^                       # the start of the string
        [a-zA-Z0-9!_.*'()-]+    # 1 or more: ~abc*(def)
        (
            /
            [a-zA-Z0-9!_.*'()-]+
        )*                      # 0 or more of /~abc*(def)
        $                       # the end of the string
        """, test, flags=re.X)
    print(test, f'match = {m is not None}')

印花:

abc match = True
-/abc/(def)/!x*yz.def.hij match = True
 类似资料:
  • 问题内容: 刚刚开始探索正则表达式的“奇迹”。作为一个从试验和错误中学习的人,我真的很努力,因为我的试验抛出了不成比例的错误……我的实验是在PHP中使用ereg()进行的。 无论如何。我分别使用名字和姓氏,但现在使用相同的正则表达式。到目前为止,我有: 任何以大写字母开头且其余仅包含字母(大写或不大写)的长度字符串。但是我分崩离析的地方是在几乎任何地方都可能发生的特殊情况下。 连字符(Worthi

  • 我希望在我的应用程序中接受带有字母和连字符或破折号的名称,我的代码基于我在这里找到的答案并编码为: 唯一的问题是它接受连字符作为我不想要的第一个字母(甚至是多个字母)。谢谢

  • 问题内容: 我有一个文档,需要从中提取一些数据。文档包含类似这样的字符串 我需要提取文字后双引号的文本 如何在Java中使用正则表达式执行此操作 问题答案: 向后隐式断言最近针对JavaScript进行了定稿,并将在ECMA-262规范的下一个出版物中发表。Chrome 66(Opera 53)支持它们,但在撰写本文时,还没有其他主流浏览器。 较早的浏览器不支持JavaScript正则表达式中的向

  • 问题内容: 好的,我整天都在阅读正则表达式,但仍然不太了解它。我正在尝试做的是验证名称,但是我在互联网上可以找到的功能只能使用,而我需要接受的字符除外。 我基本上需要一个正则表达式来检查名称至少是两个单词,并且不包含数字或特殊字符,例如,但是这些单词可以包含æ,é,Â等字符。 可接受的名称的示例为:“ JohnElkjærd”或“AndréSvenson”。 不可接受的名称为:“ Hans ”,“

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 问题内容: 我正在尝试将JSON对象数组解析为C#中的字符串数组。我可以从JSON对象提取数组,但不能将数组字符串拆分为单个对象的数组。 我有这个测试字符串: 现在,我现在正在使用以下正则表达式将项目拆分为单个对象。现在,它们是2个单独的正则表达式,直到我解决第二个正则表达式为止: 在正则表达式的工作,我期望它,但对于原因,我不明白的方式,正则表达式不会在所有的工作。我要做的就是将各个项目拆分成自