Java 模式匹配以获取值

Java 模式匹配以获取值,java,pattern-matching,c++,Java,Pattern Matching,C++,假设我有一个名为text的字符串,其中包含以下内容: blabla="A_VALUE" 通过模式匹配,是否可以直接检索引号内的值 例如:类似于格式化字符串的内容,您可以在其中写入模式%s,然后获取该值 目前,我发现的一个解决办法是: text = text.replace("blabla=",""); text = text.replaceAll("\"",""); 然而,这是非常丑陋的 注意:它不一定是java,我想知道这个概念是否存在,如果存在,它有什么名称。 这提供了一些见解,尽管我不

假设我有一个名为text的字符串,其中包含以下内容:

blabla="A_VALUE"
通过模式匹配,是否可以直接检索引号内的值

例如:类似于格式化字符串的内容,您可以在其中写入模式%s,然后获取该值

目前,我发现的一个解决办法是:

text = text.replace("blabla=","");
text = text.replaceAll("\"","");
然而,这是非常丑陋的

注意:它不一定是java,我想知道这个概念是否存在,如果存在,它有什么名称。

这提供了一些见解,尽管我不确定
\\\\\\\\\\\\\\\s*(\\s+?)\\s*
的意思是什么,在这里有
sscanf
,与您描述的类似

但是Java有一个Scanner类而不是这样的函数

另一种方法是使用正则表达式,然后检查相关的匹配器组,如下所述:

中有
sscanf
,与您描述的类似

但是Java有一个Scanner类而不是这样的函数


另一种方法是使用正则表达式,然后检查相关的匹配器组,如下所述:

您的意思是获取包含任何转义双引号的字符串内容吗

如果是这样的话,那么这个模式应该适合您:
“(\\.[^]”)*“

这意味着:找到一个双引号,然后找到零个或多个转义字符或任何不是双引号的字符,直到找到另一个引号

细分:

  • -查找双引号
  • \\.
    -查找任何转义字符
  • [^”]
    -查找任何非双引号的字符
  • (x | y)*
    -查找x或y零次或多次
  • (\\.[^”])*
    -查找任何转义字符或任何非双引号字符零次或多次
它将发现:

Source                        Result
----------------------------+---------------
var str1 = "a string";      | "a string"
var str2 = "a \" string"    | "a \" string"
var str3 = "";              | ""
var str4 = "a string \\";   | "a string \\"

您的意思是获取包含任何转义双引号的字符串的内容吗

如果是这样的话,那么这个模式应该适合您:
“(\\.[^]”)*“

这意味着:找到一个双引号,然后找到零个或多个转义字符或任何不是双引号的字符,直到找到另一个引号

细分:

  • -查找双引号
  • \\.
    -查找任何转义字符
  • [^”]
    -查找任何非双引号的字符
  • (x | y)*
    -查找x或y零次或多次
  • (\\.[^”])*
    -查找任何转义字符或任何非双引号字符零次或多次
它将发现:

Source                        Result
----------------------------+---------------
var str1 = "a string";      | "a string"
var str2 = "a \" string"    | "a \" string"
var str3 = "";              | ""
var str4 = "a string \\";   | "a string \\"

要澄清的是,您是否试图从
字符串
中检索
?可能的重复:要澄清,您是否试图从
字符串中检索
A_值
?可能的重复:如果最后一个字符是转义反斜杠,这不会失败吗?我前面评论的补充:输入后面还有更多带引号的字符串。@PatrickParker是的,很好。我做了一次编辑来纠正这个问题。这一行text=text.replaceAll(“\”,”);表明我实际上在删除引号。这就是为什么我使用模式匹配的原因,因为我需要查找的只是一个字符串。但是,如果我在回答中删除了“之后”的话,你的技术会起作用的@Maude是的,它可以很容易地被剥掉。或者,您可以使用正向lookback/lookahead regexp语法,而不是匹配quotemark,而是匹配quotemark后/前的零宽度位置。如果最后一个字符是转义反斜杠,这不会失败吗?我前面的注释的附录:输入后面有更多的带引号的字符串。@PatrickParker是,好电话。我做了一次编辑来纠正这个问题。这一行text=text.replaceAll(“\”,”);表明我实际上在删除引号。这就是为什么我使用模式匹配的原因,因为我需要查找的只是一个字符串。但是,如果我在回答中删除了“之后”的话,你的技术会起作用的@Maude是的,它可以很容易地被剥掉。或者,您可以使用正向lookback/lookahead regexp语法来匹配quotemark之后/之前的零宽度位置,而不是匹配quotemark。我在其他地方使用了pattern和regex,但会得到match.start,然后努力格式化match.end以删除不需要的字符。让我们假设我的模式是“blabla=”,然后我仍然需要在之后做一些工作来获得实际值。我缺少'group'关键字,它似乎允许您获取模式中的数据。我发现了有用的链接:有趣的链接。我在其他地方使用了pattern和regex,但会得到match.start,然后努力格式化match.end以删除不需要的字符。让我们假设我的模式是“blabla=”,然后我仍然需要在之后做一些工作来获得实际值。我缺少'group'关键字,它似乎允许您获取模式中的数据。我找到了有用的链接: