我必须验证一个拟模仿化学式的字符串(不包括电荷(+/-)之类的符号),并且必须尊重该式的书写方式(正确使用括号,每个括号最多两个字母)元素,并且没有非括号的非字母数字字符)。但是,不需要知道所提交的分子是否能够存在-仅在字符串本身有效的情况下。
比方说,要验证的字符串内容如下:“ Na3(CO2)3”
假设我已经验证了字符串不为空,并且没有任何非法字符或括号的错误使用,则有必要将字符串分隔开,例如使用符号,以便存储单个元素(我是指所有元素。在这种情况下,是3 Na和3个CO2颗粒)。
所以应该这样划分:
"Na",
"3",
"(",
"C"
"O"
"2"
")"
"3"
我试图用for
对其进行分割,但是要“分离”字符串的条件太多,我不确定如何正确地进行分离-特别是考虑到一个元素可以具有1或2字符。
目前,我的代码看起来像这样,忽略了其他易于验证的内容。
public boolean validerFormuleChimique(String formuleChimique, StringWrapper message)
{
ArrayList<String> symbolSubmited = new ArrayList<String>();
symbolSubmited.add(new String());
symbolSubmited.get(0).equals("");
for (int i =0; i< formuleChimique.length(); i++)
{
if(!Character.isLetterOrDigit(formuleChimique.charAt(i)) &&
( formuleChimique.charAt(i) != '(' ||
formuleChimique.charAt(i) != ')' ))
{
message.contenu = messagesErreur[9];
return false;
}
}
return false;
}
我在代码中看到的另一个问题是,我无法使用ArrayList中的+ =来修改字符串。我可以使用数组,但是在验证之前无法知道公式的长度。就是这样。
我希望不仅可以验证公式,而且可以将公式的每个“符号”(包括数字和括号)存储在字符串的ArrayList中。
答案 0 :(得分:1)
如果可以假定小写字母是当前标记的延续,则可以使用以下示例:
public static void main(String[] args) {
String test = "Na3(CO2)3";
Pattern r = Pattern.compile("A[cglmrstu]|B[aehikr]?|C[adeflmnorsu]?|D[bsy]|E[rsu]|F[elmr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airuv]|M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|S[bcegimnr]?|T[abcehilm]|U(u[opst])?|V|W|Xe|Yb?|Z[nr]|\\d|\\(|\\)");
Matcher matcher =r.matcher(test);
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end() + " ");
System.out.println(matcher.group());
}
}
这是输出:
Start index: 0 End index: 2 Na
Start index: 2 End index: 3 3
Start index: 3 End index: 4 (
Start index: 4 End index: 5 C
Start index: 5 End index: 6 O
Start index: 6 End index: 7 2
Start index: 7 End index: 8 )
Start index: 8 End index: 9 3
答案 1 :(得分:0)
在进行迭代时,基本上需要计算令牌。括号是简单的标记。数字非常容易-只要下一个字符是数字,您就必须继续前进。
真正的窍门是元素名称的字符。有两种方法可以解决此问题。如果可以使用标准符号来指望元素,则可以简单地假设小写字母是当前标记的延续,而大写字母是新标记的开头。因此,NaCl会正确地变成两个标记,Na和Cl,而CO2会变成三个标记,C,O和2。
如果您不能指望标准化的大写字母,您的生活会变得更加艰难。