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

如果在regex中使用空格作为分隔符,如何处理值中的空格?

长孙景天
2023-03-14

我正在尝试运行正则表达式来捕获以下字符串的键和值:

名称=“Evoke Sprite”父级=“EvokeObjects”实例=ExtResource(5)id=5

下面是每种类型的一些语法注释,如下所示:

>

  • 键:一串字母,无空格
  • 值:

    • 可能有引号,例如“EvokeObjects”
    • 引号内可能有空格
    • 引号内可能有特殊字符,例如“hello/world@!18”
    • 可能有一个函数,如string("ExtResource(5 )").
    • 函数字符串将在括号内包含空格

    我已经在引号内有空格:

    (.*?)=(?:"(.*?)"|(.*?))(?: |$)

    因此,这将与< code > name = " Evoke Sprite " parent = " Evoke objects " id = 5 一起工作

    要测试的regex101:https://regex101.com/r/xkRRsD/1

    当我添加ExtResource(5)时出现问题,因为它在括号内有空格。然后之前的正则表达式代码失败。

    作为一种可能的解决方法,我想也许我可以通过在代码中进行字符串替换来完全从括号中删除空格。但是我想知道是否有正则表达式解决方案?

  • 共有3个答案

    刘令
    2023-03-14

    你可以使用

    ([a-z]+)=(?:"(.*?)"|(.*?))(?:(?=[a-z]+?=)|$)
    

    Regex演示

    殳凯捷
    2023-03-14

    编辑:v5,这应该会命中@Andreas的所有测试用例。

    看起来你的正则表达式非常接近,但是你的非捕获组中的最后一个语句(.*?)将把开放括号后面的空格视为其搜索的“结束”,因为它在到达空格之前消耗尽可能少的字符。假设您知道函数字符串在括号之间会有空格,那么这个正则表达式似乎可以解决问题:

    (\S*?)=(?:"(.*?)"||(\S*?))(?: |$)

    关键是,\S匹配任何非空白字符-因为永远不会有像id=某些val这样的示例,这是一个很好的选择,因为它不会在函数的括号上运行。它还确保键名没有空格,如pare nt=val

    在这里试试吧!

    呼延卓
    2023-03-14

    在交替的第二部分中,您将匹配到空格或字符串的末尾,以便匹配ExtResource(

    你可以做的是不匹配括号,或者从开始匹配到结束括号。

    您可以使用一个取反的字符类,而不是使用非贪婪的量词。

    ([^=\s]+)=(?:"([^"]+)"|((?:[^\s()"]|\([^()]*\))+))
    

    说明

    • ([^=])=捕获组1,匹配除=以外的任何字符,然后匹配
    • (?:非捕获组
      • “([^”]*)”Match“,然后捕获组2中除“”以外的任何字符,然后匹配“
      • |
      • (捕获组3
        • (?:非捕获组
          • [^\s()“]匹配除
          • |
          • \([^()]*\)匹配从左括号到右括号

          正则表达式演示

     类似资料:
    • 问题内容: 什么正则表达式模式需要我传递给 拆分成字符串使用的所有空格字符(子字符串数组,等)作为分隔符? 问题答案: 某些东西 这会将所有空白分组为分隔符。 因此,如果我有字符串: 这将产生字符串并省略和之间的空白。 正如VonC指出的那样,应该转义反斜杠,因为Java首先会尝试将字符串转义为特殊字符,然后将其发送给解析。你想要的是字面量,这意味着你需要通过。可能会造成一些混乱。 在相当于。

    • 问题内容: 我需要一个类似于的函数,但可能会有多个空格,并且有意义的字符之间的空格数也不相同。像这样: 我可以以某种方式使用正则表达式来捕捉它们之间的空格吗? 问题答案: 如果您不向传递任何参数,它将把空格运行视为单个分隔符: 或者如果你想

    • 在这种情况下,是否可以定义边距和/或直接在列表项的布局中添加自定义分隔视图,或者是否有更好的方法来实现我的目标?

    • 当使用spring Batch从db写入csv文件时,我需要在每个列的分隔符之前根据条件添加空格。 例如,我在csv文件中要求间隔

    • 所以,我有以下情况: 所以,我知道用户会输入这样的内容:爱猫和狗。我希望第一个单词(在这个例子中是爱情)总是在第一个字符串中,其他所有单词都在第二个字符串中。我怎样才能做到尽可能简单?

    • 问题内容: 在我的字符串中,我想基于两个或多个空格来分割字符串或标记化字符串。 防爆 我想输出为- 问题答案: (要么) 分割两个或多个空格作为分隔符的字符串。在正则表达式中使用转义字符可以提高可读性,而不是使用空格字符。