1

假设我有一个包含以下行的文件:

Hayden
y

假设我想操纵只包含“y”而不是海登的那一行,我该怎么做?

所以我读入文件并逐行解析。我想说如果该行包含“y”之前或之后的字母,那么它不是我正在寻找的行。

我以为我可以做到以下几点:

String value = "y"; 
if(strLine.matches("[a-zA-Z]" + value + "[a-zA-Z]"))
{
      don't manipulate line here
}
else
{
   manipulate string here
}

但是,这会得到“Hayden”和“y”

有任何想法吗?

编辑

对不起,我应该更清楚,如果我不介意前面是否有空格或符号怎么办?还是后面?尤其是我需要注意的字母。例如,我不能有 yh 但我可以有 y=... 再次抱歉

4

5 回答 5

4

您可以使用负面环视

if (strLine.matches("^.*(?<![a-zA-Z])y(?![a-zA-Z]).*$")) { 
    // manipulate string here
}

锚点是可选的,但为了清楚起见无论如何都包括在内。

于 2012-08-05T22:44:51.337 回答
3

您可以使用:

strLine.matches("^y$")

要忽略符号,即非字母数字字符,请使用:

strLine.matches("^\\W*y\\W*$")
于 2012-08-05T22:44:59.307 回答
1

也许这就是你要找的

String[] lines={"Hayden","y"," y*","y=","y+"," +y..."};
for (String s:lines)
    System.out.println(s+"->"+s.matches("\\W*y\\W*"));

输出:

Hayden->false
y->true
 y*->true
y=->true
y+->true
 +y...->true
于 2012-08-05T22:51:44.987 回答
0

Extending the equals approach: Just remove all the character you don't mind, and then check for equality with "y":

if (strLine.replaceAll("[^a-zA-Z]", "").equals("y")) {
    ...
}
于 2012-08-05T22:52:26.670 回答
0

如果要使用正则表达式,则需要更具体一点:

  • y匹配y行中的任意位置。
  • ^y$匹配y字符串末尾(美元符号)之前和字符串开头(插入符号)之后的 a。这使您可以匹配等于的行y
于 2012-08-05T22:45:02.523 回答