Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式查找令牌-Java Scanner或其他替代方法_Java_Regex_Parsing_Tokenize - Fatal编程技术网

正则表达式查找令牌-Java Scanner或其他替代方法

正则表达式查找令牌-Java Scanner或其他替代方法,java,regex,parsing,tokenize,Java,Regex,Parsing,Tokenize,嗨,我正试图编写一个类,将一些文本转换成定义良好的标记 字符串有点类似于代码:brownfox'c';。我想得到的是一个来自扫描仪的令牌或者是一个切分后的数组,我认为两者都可以正常工作,布朗,福克斯,c;单独使用,因为它们是潜在代币,包括: 带“和”的引用文本 带或不带小数点的数字 括号、大括号、分号、等号、尖括号、| |、, 福,;,'条',{ 灰色,福克斯,=,-565.4546 喂,喂,你好{ 但我有: foo,;'bar',,,{ 灰色,福克斯,=-565.4546 喂,喂{ 请注意,当

嗨,我正试图编写一个类,将一些文本转换成定义良好的标记

字符串有点类似于代码:brownfox'c';。我想得到的是一个来自扫描仪的令牌或者是一个切分后的数组,我认为两者都可以正常工作,布朗,福克斯,c;单独使用,因为它们是潜在代币,包括:

带“和”的引用文本 带或不带小数点的数字 括号、大括号、分号、等号、尖括号、| |、, 福,;,'条',{

灰色,福克斯,=,-565.4546

喂,喂,你好{

但我有:

foo,;'bar',,,{

灰色,福克斯,=-565.4546

喂,喂{

请注意,当=和其他之间存在空格时,例如:gray fox=-565.4546;将导致:

灰色,福克斯,=,-565.4546

我对上述正则表达式所做的是:

Scanner scanner = new Scanner(line);
    scanner.useDelimiter(MY_MENTIONED_REGEX_HERE);
    while (scanner.hasNext()) {
       System.out.println("Got: `" + scanner.next() +"`");
       //Some work here

}

想法是从特殊情况开始到一般情况。尝试以下表达式:

Java字符串:
[\']?:[^\']+\124;?!\\ 1[\']*\\1 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\这个想法是从特殊情况开始到一般情况。请尝试以下表达式:

Java字符串: [\']?:[^\']+|?!\\1[\']*\\1描述 既然您正在查找可能包含小数点的所有字母数字文本,为什么不忽略分隔符呢?以下正则表达式将从您的输入字符串中提取所有包含小数点的字母数字块。这是有效的,因为您的示例文本为:

"foo";'bar')(;{
gray fox=-56565.4546;
foo boo="hello"{
正则表达式:?:[']?[-]?[a-z0-9-.]*\1 |?说明 既然您正在查找可能包含小数点的所有字母数字文本,为什么不忽略分隔符呢?以下正则表达式将从您的输入字符串中提取所有包含小数点的字母数字块。这是有效的,因为您的示例文本为:

"foo";'bar')(;{
gray fox=-56565.4546;
foo boo="hello"{

正则表达式:?:[']?[-]?[a-z0-9-.]*\1 |?您的问题主要是您试图对一个正则表达式做太多的工作,因此无法理解部件的交互作用。作为人类,我们都有这个问题

在编译器业务中,您所做的是一种标准的处理方法,称为词法分析。词法分析生成器为您感兴趣的每个标记接受一个正则表达式,并构建一组复杂的状态,这些状态将挑选出各个词素(如果它们是可区分的)。每个标记单独的词法定义使它们变得容易,并且n-单独编写容易混淆。lexer生成器使识别所有成员变得简单而高效。如果您想定义包含特定引号的词素,那么很容易做到这一点


查看任何一个广泛可用的解析器生成器;它们都包括词法分析引擎,例如JCup、ANTLR、JavaCC,

您的问题主要是您试图对一个正则表达式执行太多操作,因此无法理解部件的交互。作为人类,我们都有这个问题

在编译器业务中,您所做的是一种标准的处理方法,称为词法分析。词法分析生成器为您感兴趣的每个标记接受一个正则表达式,并构建一组复杂的状态,这些状态将挑选出各个词素(如果它们是可区分的)。每个标记单独的词法定义使它们变得容易,并且n-单独编写容易混淆。lexer生成器使识别所有成员变得简单而高效。如果您想定义包含特定引号的词素,那么很容易做到这一点


查看任何广泛可用的解析器生成器;它们都包括词法分析引擎,例如JCup、ANTLR、JavaCC等。也许使用扫描生成器比使用正则表达式更容易实现您的目标


即使您更喜欢手工编写代码,我认为更好的做法是对代码进行更多的结构化。一个简单的解决方案是创建单独的方法,尝试从您的文本中使用您想要识别的不同类型的标记。每个这样的方法都可以判断它是否成功。这样,您就有了几个较小的c大块的代码,负责不同的标记,而不是一大块更难理解和编写的代码。

也许使用扫描生成器(例如)比使用正则表达式更容易实现您的目标


即使您更喜欢手工编写代码,我认为更好的做法是对代码进行更多的结构化。一个简单的解决方案是创建单独的方法,尝试从您的文本中使用您想要识别的不同类型的标记。每个这样的方法都可以判断它是否成功。这样,您就有了几个较小的c大块的代码,负责不同的标记,而不是一大块更难理解和编写的代码。

谢谢,但是使用这个正则表达式会产生奇怪的结果,例如foo bar | | | 55.555;,它将数字分为55和.555;因此我仍然需要说服它以某种方式将两者都视为
学生:我给你们的只是一个例子,对于你们发现的每一个特殊情况,你们必须调整它!将其添加到word类中:\w变为[\w.-]。我们的目标是让你理解正则表达式,并使用它。是的,很抱歉我不得不读它一次或多次,但我现在真正关心的是失去了轻松检测“坏”字符的能力,因为假设在定义了所有情况后,我只会跳过them@SadStudent:在这种情况下,remove |\S+=所有不是处理所有其他情况的空白。如果我们将整个输入作为字符串,那么我们可以使用\G编写标记器。谢谢,但使用此正则表达式会在foo bar | | 55.555;等示例中产生奇怪的结果,它将数字分为55和.555;所以我仍然需要说服它以某种方式处理这两种情况。学生:我给你们的只是一个例子,对于你们发现的每一个特殊情况,你们必须调整它!将其添加到word类中:\w变为[\w.-]。我们的目标是让你理解正则表达式,并使用它。是的,很抱歉我不得不读它一次或多次,但我现在真正关心的是失去了轻松检测“坏”字符的能力,因为假设在定义了所有情况后,我只会跳过them@SadStudent:在这种情况下,remove |\S+=所有不是处理所有其他情况的空白。如果我们将整个输入作为字符串,那么我们可以使用\G编写标记器。谢谢,但遗憾的是,我确实需要and“因此我不能和fox呆在一起,也不能只跟fox呆在一起,我已经添加了一些示例和我目前所做的代码示例。您可以尝试在正则表达式中添加一些空格,以使其更易于阅读。@Andrei,我已经添加了正则表达式工作原理的逐字解释。谢谢,但遗憾的是,我确实需要and“所以我不能继续使用fox或仅使用fox,我已经添加了一些示例和我目前所做的代码示例。您可以尝试在正则表达式中添加一些空格,使其更易于阅读。@Andrei,我已经添加了正则表达式工作原理的逐字符解释。