Java区分四个相似字符串

Java区分四个相似字符串,java,Java,我正在编写的这个特定类从一个文本文件中获取输入,该文本文件是从用于测量图表的OCR软件中获取的。输入数据相当脏,这个类的目的是清理它,并最终将其分配给一个对象数组,其他类将使用该数组 现在我的问题是:我需要能够识别4种不同类型的字符集。如果我的代码在行首找到这些,它就知道特定的行需要包含在我想要使用的字符串[]数组中。需要识别的四个集合的格式为“AZ”、“A1Z1”、“ZA1”和“Z1A”(可以是任何字母字符和1-9数字) 分为 “AZ”,1063.66,“2521446”,“A”,63764.

我正在编写的这个特定类从一个文本文件中获取输入,该文本文件是从用于测量图表的OCR软件中获取的。输入数据相当脏,这个类的目的是清理它,并最终将其分配给一个对象数组,其他类将使用该数组

现在我的问题是:我需要能够识别4种不同类型的字符集。如果我的代码在行首找到这些,它就知道特定的行需要包含在我想要使用的字符串[]数组中。需要识别的四个集合的格式为“AZ”、“A1Z1”、“ZA1”和“Z1A”(可以是任何字母字符和1-9数字)

分为 “AZ”,1063.66,“2521446”,“A”,63764.73138675.41

String typeTwo = "A1Z11063.662521446A63764.73138685.41"
String typeThree "ZA111063.662521446A63764.73138685.41"
String typeFour "Z1A1063.662521446A63764.73138685.41"
分为“A1Z1”,1063.66,“2521446”,“A1”,63764.73,138675.41

String typeTwo = "A1Z11063.662521446A63764.73138685.41"
String typeThree "ZA111063.662521446A63764.73138685.41"
String typeFour "Z1A1063.662521446A63764.73138685.41"
分为:“ZA1”,1063.66,“2521446”,“Z”,63764.73,138675.41

String typeTwo = "A1Z11063.662521446A63764.73138685.41"
String typeThree "ZA111063.662521446A63764.73138685.41"
String typeFour "Z1A1063.662521446A63764.73138685.41"
分为“Z1A”,1063.66,“2521446”,“Z1”,63764.73,138675.41

String typeTwo = "A1Z11063.662521446A63764.73138685.41"
String typeThree "ZA111063.662521446A63764.73138685.41"
String typeFour "Z1A1063.662521446A63764.73138685.41"
现在的问题是,到目前为止我设计的每个测试都无法区分typeOne和typeThree,因为两个字符串中的第三个字符都是数字,而且这些字符串从来没有固定的长度。我真的很好奇,我如何能发现这两种类型之间的差异


编辑:为了澄清起见-在初始“标识符”(AZ1)之后,我想要的第二组数据稍后将转换为双精度(1063.66)。这意味着我需要识别AZ1的情况,因此1不会被添加到double中(11063.66)。虽然如果组成字符串的不同部分具有固定长度,这将相对简单,但它们没有,因此问题就出现了。

您可以使用startsWith()方法,如


第二行将返回true

我不太确定我是否正确理解了这个问题,但您是否尝试过反向解析它

如果你从最后开始,你有 6.2位浮点数, 5.2位浮点数, 信 6位数字 4.2位数浮点数 -休息(你的分离)


如果没有固定长度,则输入似乎不可分离。对不起,为什么不使用正则表达式匹配?如果在案例3中,首字母等于第18个字母(正如您给出的示例所示),这就是表达式

s.matches("^[A-Z]{2}[0-9].*") && (s.charAt(0) == s.charAt(18));
s3.matches("^[A-Z]{2}.{34}");
如果case3字符串比case1长(正如您给出的示例所示),这就是表达式

s.matches("^[A-Z]{2}[0-9].*") && (s.charAt(0) == s.charAt(18));
s3.matches("^[A-Z]{2}.{34}");

当输入字符串的大小可变时,您将无法确定它是类型1还是类型3。唯一的方法是设置字符串的类型,比如“AZ1”总是输入3。等一下,如果任何字母字符和数字都是有效的,为什么类型3不是类型1的子集?从你的例子中,我知道第三个字符是数字并不意味着它不是1型。你能用人类的语言描述一下人类是如何将这两者分开的吗?为什么您的typeOne示例不是类型3?@Aziuth这正是让我感到不舒服的地方,没有办法区分格式完全相同的字符串
[a-Z][a-Z][0-9][a-Z0-9]*
它们遵循相同的表达式,因此肯定没有办法区分,除非是非确定性。这行不通,
(可以是任何字母字符和1-9数字)
,表示字符串不总是遵循具有
ZA1
的方案,它们可以有不同的开头匹配
[A-Z][A-Z][0-9][A-Z0-9]*
我目前正在使用正则表达式,但由于字符串从来没有固定的长度,我将无法确定它需要匹配的字符位于何处。只需完成回答:如果第一个字符等于第n个位置的字符,则可以查找匹配的索引,直到该字符和com删去第一个和第n个。这确实是我理解你所说的,但我的观点仍然站得住脚。我仍然无法知道字符串开头“AZ”后面的字符是下一个值的一部分还是应该是“AZ1”的一部分。谢天谢地,我确实通过比较上一个和下一个字符串输入的字符解决了这个问题,因为数据应该是连续的。不过,感谢您的帮助!我很高兴您解决了这个问题。为了解决这个问题,我能问您这是否可行吗?
System.out.println(“s3”+(s3.charAt(0)=s3.split(^[A-Z]{2}[0-9]+\\.[0-9]+''[1].字符(0)));
这将输出true,这意味着数字后面的第一个字符和第一个字符相等。您的逻辑是正确的,是的,但我仍然无法知道第一组字母后面的第一个数字是字符串的一部分还是下面的浮点数。我已经花了几个小时来解决这个问题,现在我来解决这个问题这句话的意思是,很难用简单的字符串来做我想做的事情。但是当你考虑字符串前后的输入时,这个过程比较简单。实际上,这实际上是一个很好的主意!我可以开始把字符串从后面往前分开,剩下的都是B。e标识符。非常感谢!