什么是正则表达式来标识java中的字符串文字?

时间:2013-09-04 18:45:03

标签: java regex string string-literals javacc

我正在尝试编写解析器,我需要识别字符串文字,如果我的字符串以'(即单引号)开头和结尾,那么识别字符串文字的正则表达式是什么?

我正在使用javacc编写解析器。任何人都可以帮助我使用令牌格式的实际正则表达式代码?我已经自己尝试了。

例如

< INTEGER_VALUE:“0”| ([“1” - “9”]([“0” - “9”])*)>

这是识别整数文字的标记格式,我想要字符串文字的相同标记格式,其中字符串以单引号开头和结尾,我也尝试使用元字符(在http://www.vogella.com/articles/JavaRegularExpressions/article.html教程中给出)但没有成功结果

2 个答案:

答案 0 :(得分:1)

我假设你正在使用JavaCC。答案取决于您的语言中字符串的语法。假设除撇号之外的任何字符串都允许使用任何字符。即一个字符串由两个撇号组成,其间包含任意数量(0个或更多)的非偶极子。

<STRING: "'" (~["'"])* "'">

现在许多语言不允许换行符或字符串返回。所以在这里我们也禁止它们:

<STRING: "'" (~["'","\n","\r"])* "'">

现在的问题是:如果有人想放撇号,换行符或退货怎么办?有些语言(例如C)使用反斜杠作为转义,所以让我们说

  • \'表示撇号
  • \ n表示换行符
  • \ r \ n表示返回
  • \\表示反斜杠
  • \ x其中x是任何其他字符被视为错误

这是表达式

<STRING: "'"  ("\\" ("\\" | "n" | "r" | "'") | ~["\\","\n","\r","'"] )* "'"

即。一个字符串是两个撇号,其间有一个0或更多组的序列,其中每个组是两个字符序列之一\\,\ n,\ r,\',或者不是反斜杠的字符,换行符,返回或撇号。

另一种方法是使用词汇状态。

<DEFAULT> MORE: { "'" : INSTRING }
<INSTRING> MORE: { "\\\\" 
                 | "\\n" 
                 | "\\r"  
                 | "\\'"
                 | ~["\\","\n","\r","'"]
                 }
<INSTRING> TOKEN: { "'" : DEFAULT }

答案 1 :(得分:0)

不够接近,让我们考虑以下

// 'here is comment'
'is't correct string?'

你有单引号,但它不是一个确定的字符串。如果你确保删除注释,并且引号之间的任何符号都将被转义为''(就像在大多数编程语言中一样)。我相信一切都会像你描述的算法一样好。