我正在尝试运行正则表达式来捕获以下字符串的键和值:
名称=“Evoke Sprite”父级=“EvokeObjects”实例=ExtResource(5)id=5
下面是每种类型的一些语法注释,如下所示:
>
值:
我已经在引号内有空格:
(.*?)=(?:"(.*?)"|(.*?))(?: |$)
因此,这将与< code > name = " Evoke Sprite " parent = " Evoke objects " id = 5 一起工作
要测试的regex101:https://regex101.com/r/xkRRsD/1
当我添加ExtResource(5)
时出现问题,因为它在括号内有空格。然后之前的正则表达式代码失败。
作为一种可能的解决方法,我想也许我可以通过在代码中进行字符串替换来完全从括号中删除空格。但是我想知道是否有正则表达式解决方案?
你可以使用
([a-z]+)=(?:"(.*?)"|(.*?))(?:(?=[a-z]+?=)|$)
Regex演示
编辑:v5,这应该会命中@Andreas的所有测试用例。
看起来你的正则表达式非常接近,但是你的非捕获组中的最后一个语句(.*?)
将把开放括号后面的空格视为其搜索的“结束”,因为它在到达空格之前消耗尽可能少的字符。假设您知道函数字符串在括号之间会有空格,那么这个正则表达式似乎可以解决问题:
(\S*?)=(?:"(.*?)"||(\S*?))(?: |$)
关键是,\S
匹配任何非空白字符-因为永远不会有像id=某些val
这样的示例,这是一个很好的选择,因为它不会在函数的括号上运行。它还确保键名没有空格,如pare nt=val
。
在这里试试吧!
在交替的第二部分中,您将匹配到空格或字符串的末尾,以便匹配ExtResource(
你可以做的是不匹配括号,或者从开始匹配到结束括号。
您可以使用一个取反的字符类,而不是使用非贪婪的量词。
([^=\s]+)=(?:"([^"]+)"|((?:[^\s()"]|\([^()]*\))+))
说明
([^=])=捕获组1,匹配除=
以外的任何字符,然后匹配
(?:
非捕获组
“([^”]*)”
Match“,然后捕获组2中除“”以外的任何字符,然后匹配“
|
或
(捕获组3
(?:
非捕获组
[^\s()“]
匹配除(
|
或
\([^()]*\)
匹配从左括号到右括号
正则表达式演示
问题内容: 什么正则表达式模式需要我传递给 拆分成字符串使用的所有空格字符(子字符串数组,等)作为分隔符? 问题答案: 某些东西 这会将所有空白分组为分隔符。 因此,如果我有字符串: 这将产生字符串并省略和之间的空白。 正如VonC指出的那样,应该转义反斜杠,因为Java首先会尝试将字符串转义为特殊字符,然后将其发送给解析。你想要的是字面量,这意味着你需要通过。可能会造成一些混乱。 在相当于。
问题内容: 我需要一个类似于的函数,但可能会有多个空格,并且有意义的字符之间的空格数也不相同。像这样: 我可以以某种方式使用正则表达式来捕捉它们之间的空格吗? 问题答案: 如果您不向传递任何参数,它将把空格运行视为单个分隔符: 或者如果你想
在这种情况下,是否可以定义边距和/或直接在列表项的布局中添加自定义分隔视图,或者是否有更好的方法来实现我的目标?
当使用spring Batch从db写入csv文件时,我需要在每个列的分隔符之前根据条件添加空格。 例如,我在csv文件中要求间隔
我的日志文件 制造商型号里程制造_年份发动机_排量发动机_动力车身_类型颜色_塞子stk_年份变速箱门_计数座位_计数燃料_类型日期_创建日期_最新价格_福特银河151000 2011 2000 103无人5 7柴油2015-11-14 18:10:06.838319 00 2016-01-27 20:40:15.46361 00 10584.75 skoda octavia 143476 201
所以,我有以下情况: 所以,我知道用户会输入这样的内容:爱猫和狗。我希望第一个单词(在这个例子中是爱情)总是在第一个字符串中,其他所有单词都在第二个字符串中。我怎样才能做到尽可能简单?