【问题标题】:How to Identify String Literals from Arrays with Regex on Java?如何在 Java 上使用正则表达式从数组中识别字符串文字?
【发布时间】:2017-10-09 05:48:25
【问题描述】:

如果我有这个名为 tokenArray 的字符串数组。其内容如下


[num1] [;] ["] [This] [is] [a] [\"] [string] [literal] [\"] [.] [?] ["]


注意:非转义和转义双引号原样。

问题:

如何将数组中两个双引号之间的值识别为单个字符串文字?, .我正在使用字符串连接来保存找到的临时词位,并在找到匹配项时最终保存到堆栈。在我识别单行注释之前的情况下,它是 // 和 tHiS_iS_tHe_EnD_Of_NeWlInE 用于开始和结束匹配。我如何将它与带有两个双引号的正则表达式一起应用,就像上面我放在下面的代码中的循环一样。 TIA。

背景:

只是我找到的样本是单个字符串声明的形式,而我的样本是在一个数组中。我不太明白它是如何处理字符串数组的。

顺便说一句。我正在制作一个字符串分析器,它扫描一段代码并输出特定语言的词位。除了没有正则表达式的语言的定界符和一些关键字之外,我已经确定了每个词位,如单个和块 cmets。但我想为我尚未检测到的字符串文字尝试正则表达式。通过 if 和 else 语句应用检测非常耗时且令人困惑,但我至少做到了。

下面是我用来识别数组中单行 cmets 的代码。 for 循环是我的整个循环,用于读取我的数组并将新检测到的词素分配给堆栈。

 for(int ctr=0;ctr<removedNullsStackSize.length;ctr++) {   
        if(removedNullsStackSize[ctr].equals("//"))   {
            do {
                tempString = tempString + " " + removedNullsStackSize[ctr] ;
                ctr++;                   
                if(ctr>=removedNullsStackSize.length-1){
                    removedNullsStackSize[ctr]="tHiS_iS_tHe_EnD_Of_NeWlInE";
                }
            } 
            while(removedNullsStackSize[ctr]!="tHiS_iS_tHe_EnD_Of_NeWlInE");
                myQCommentsTokenized.add(tempString);
                tempString="";
        } 

在上面的代码中,它的作用是在检测到 // 时连接前面的数组,并且在检测到换行符之前不会停止连接。如果检测到换行符,则将其保存为临时字符串以作为找到的新词位进行堆栈。

【问题讨论】:

  • 这个数组的来源是什么?有没有可能是 JSON 或其他常用格式?
  • 在你的数组定义中...{"int","num1",";",""","This",..., 双引号不是有原因吗逃跑了?应该是 ...{"int","num1",";",""\","This",... 吗?
  • 理想情况下,您应该在词法分析器中执行此操作,然后再将输入标记化。因为现在,你不知道单词之间有多少空格甚至换行符。
  • 只是一个典型的java数组。数组的来源来自多个数组和堆栈。就像这个一样,数组是由数组和堆栈组成的,它具有检测关键字、标识符等的条件。所以我在上面设置了示例数组。我在必须检测字符串文字的数组部分。我最近刚刚发现了正则表达式,但不能完全掌握如何将它应用到我的代码中,除非我重写我的整个程序。 :(
  • 请提供minimal reproducible example。数组中的实际内容非常不清楚,因为您只提供了一个伪代码定义。

标签: java arrays regex string


【解决方案1】:

我的模式是。

//Regex for identifying string literals
         Pattern strRegex=Pattern.compile("\".*\"");

//Loop your array here to read code

//str is the temporary location of all the codes you have
//In mine, I have it inside a text area so I just typecasted it to string and start comparing there
//begins matching` for string literals that is in the strRegex
         Matcher m = strRegex.matcher(str) ;

在阅读完代码后,它将在被阅读的代码中获得字符串字面量的词位。

 while (m.find()) { 
     String forReadStr=m.group(); 
     //If the end of the token is a double quote, Do this  
     //in this loop, you can then declare anything for the lexeme you detected and do anything with it
            if(forReadStr.endsWith("\"")){            
                 System.out.println(m.group()+"\n\t -> \t This is a String Literal\n");
            }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多