【问题标题】:Java: How to return single char after stringJava:如何在字符串后返回单个字符
【发布时间】:2012-09-06 15:25:35
【问题描述】:

我有一个看起来像这样的文件目录

C:\projects\lab3\test\test.java

C:\projects\assignment3\test\test.java

但是“lab3”或者“assignment3”可以出现在目录的任意位置,不是设置目录

我想要检查目录是否包含“实验室”或“作业”并获取后面的数字。在这种情况下为“3”

这就是我目前所拥有的

 if(directory.toLowerCase().contains("lab")){

 } else if (directory.toLowerCase().contains("assignment")){

 }

但我不知道如何在单词后面直接检查字符?

【问题讨论】:

  • 您可以使用String#substring提取“lab”之后的部分,然后使用Integer.parseInt将其作为数字获取。
  • 您确实意识到在运行时无法知道源代码的来源。即没有办法得到directory
  • 但是我将如何使用子字符串在“lab”之后直接获取?这就是我遇到的问题
  • @Peter Lawrey:我有目录,当我使用 JFileChooser 选择文件时得到它

标签: java string search


【解决方案1】:

你可以使用正则表达式:

Pattern pattern = Pattern.compile(".*(?:lab|assignment)([0-9]).*", Pattern.CASE_INSENSITIVE);
String substr = pattern.matcher(directory).replaceAll("$1");

这将获取字符串中最后一次出现“lab”或“assignment”之后的任何一位数。

为此,您需要导入以下类:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

【讨论】:

  • 我认为你不需要 .* 在开头或结尾,因为你没有使用 $ 或 ^,所以它不会检查行的开头或结尾。
【解决方案2】:

这可以满足您的要求:

String directory = "C:\\projects\\lab3\\test\\test.java";
if(directory.toLowerCase().contains("lab")){
 System.out.println(directory.substring(directory.indexOf("lab")+3,   directory.indexOf("lab")+4));

         }

+3 参数是因为“lab”字符串的大小。你可以通过这种方式做得更好:

String directory = "C:\\projects\\lab3\\test\\test.java";
String myWord = "lab";
if(directory.toLowerCase().contains(myWord)){
  System.out.println(directory.substring(directory.indexOf(myWord)+ myWord.length(), directory.indexOf(myWord)+ myWord.length()+1));

         }

【讨论】:

  • 干杯,这正是我正在寻找的,这样我就可以搜索“实验室”或“作业”的位置,然后从那里开始工作......再次感谢 :)
【解决方案3】:

您可以使用String#substring提取“实验室”之后的部分,然后使用Integer#parseInt检查它是否为整数并进行转换。

String partAfterLab = filename.substring(4);

【讨论】:

    【解决方案4】:

    您可以使用像C:\\\\projects\\\\(lab|assignment)([0-9]+)\\\\.* 这样的正则表达式来提取“lab”或“assignment”之后的数字。

    【讨论】:

      【解决方案5】:

      使用正则表达式

      public static void main(final String[] args) {
          final String dir = "C:\\projects\\lab3\\test\\test.java";
      
          final Pattern pattern = Pattern.compile(".*?(lab)(\\d+).*");
          final Matcher matcher = pattern.matcher(dir);
          if (matcher.find()) {
              System.out.println(matcher.group(1)); //contains lab
              System.out.println(matcher.group(2)); //contains number
          }
      }
      

      【讨论】:

        【解决方案6】:

        这是另一种方法:

        Integer.valueOf(s.replaceFirst(".*(assignment|lab)([0-9]+).*", "$2"));
        

        例如:

        String assignment = "C:\\projects\\assignment3\\test\\test.java";
        String lab = "C:\\projects\\lab3\\test\\test.java";
        String none = "C:\\projects\\test\\test.java";
        
        try {
            int assignmentNumber = Integer.valueOf(assignment.replaceFirst(".*(assignment|lab)([0-9]+).*", "$2"));
            System.out.println(assignmentNumber);
        } catch (NumberFormatException e) {
            System.out.println("Can't find neither assignment nor lab");
        }
        
        try {
            int labNumber = Integer.valueOf(lab.replaceFirst(".*(assignment|lab)([0-9]+).*", "$2"));
            System.out.println(labNumber);
        } catch (NumberFormatException e) {
            System.out.println("Can't find neither assignment nor lab");
        }
        
        try {
            int noneNumber = Integer.valueOf(none.replaceFirst(".*(assignment|lab)([0-9]+).*", "$2"));
            System.out.println(noneNumber);
        } catch (NumberFormatException e) {
            System.out.println("Can't find neither assignment nor lab");
        }
        

        打印:

        3
        3
        Can't find neither assignment nor lab
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-09
          • 1970-01-01
          • 2021-12-13
          • 2019-03-13
          相关资源
          最近更新 更多