java提取字符串中需要的数据

本文介绍了一种从用户输入的自由文本中提取特定商品名称的方法,通过使用Java的集合和流API,实现了对商品名称的有效识别。同时,文章还分享了如何利用正则表达式匹配手机号码的技术细节。

最近做了个项目需要从一段字符串中提取出关键的信息,并拿出来使用。相当于张三进了一个无人超市对机器人说:帮我拿一瓶可口可乐,谢谢!!! 这句话有很多种说法,又比如:给我来一瓶可乐,但不管张三怎么说可乐这个商品是不会变得,如果变了,就又变成买别的东西了。所以我们要抓住可乐这个重要的元素,把这个元素提取出来,让机器人去拿和计算价格。

下面就开始做正事了

1.首先要先创建一个集合,把商品放入集合里面,考虑到商品名称是不会重复的,所以使用set集合

 //商品集合
    private static final Set<String> shopType = Stream.of(
            "可乐", "雪碧", "百岁山", "农夫山泉", "冰红茶", "绿茶", "芬达", "脉动",
            "王老吉", "今麦郎", "哇哈哈"
    ).collect(Collectors.toSet());

2.现在集合已经创建完成了,接下来就要通过这个集合去对比用户说的话 看看有没有用户说的商品,如果有就把商品的名称给提取出来并返回

    //判断用户说的商品是否存在
    private static Set<String> getShoesType (String message){
        Set<String> clothesTypeSet = shopType.stream()
                .filter(clothesType -> message.contains(clothesType)).collect(Collectors.toSet());
        return clothesTypeSet;
    }

3.最后一步,在方法中调用

public static void main(String[] args) {
        String me = "我想买瓶百岁山";
        Set shopName = getShoesType(me);
        System.out.println(shopName);
        String mes = "我想买瓶";
        Set shopNames = getShoesType(mes);
        System.out.println(shopNames);
    }

4.执行方法后控制台显示如下
在这里插入图片描述

使用正则表达式匹配手机号

1、写一个匹配手机号的方法

    public static String getPhone(String remark){
        Pattern pattern = Pattern.compile("((13[0-9])|(14[5-9])|(15([0-3]|[5-9]))|(16[6-7])|(17[1-8])|(18[0-9])|(19[1|3])|(19[5|6])|(19[8|9]))\\d{8}");
        Matcher matcher = pattern.matcher(remark);
        //匹配到的所有手机号,取第一条
        if (matcher.find()) {
            return matcher.group();
        }
        //匹配所有手机号,保存在数组中,可根据数组下标选择
        List list = new ArrayList();
        while (matcher.find()) {
            list.add(matcher.group());
        }
        System.out.println(list);
        return null;
    }

2、单元测试

public static void main(String[] args) {
      String str1 = "阿斯顿19167876787撒旦阿斯顿18767876787撒旦22";
      String phone = getPhone(str1);
      System.out.println(phone);
}
<think>我们正在处理一个关于Java字符串处理的问题:从特定位置提取单个数据。 根据用户的问题,我们需要从字符串提取特定位置的单个数据(可能是一个字符或子字符串)。 在Java中,字符串是由字符组成的序列,可以通过索引访问每个字符。索引从0开始。 方法: 1. 使用charAt(int index)方法:提取指定位置的单个字符。 2. 使用substring(int beginIndex, int endIndex)方法:提取从beginIndex开始到endIndex-1结束的子字符串(即包括beginIndex,不包括endIndex)。如果只指定beginIndex,则提取从该索引到字符串末尾。 示例: 假设有一个字符串:String str = "Hello, World!"; 我们想提取第7个位置的字符(索引为6,因为从0开始)和从位置7到12(索引6到11)的子字符串。 步骤: 1. 提取单个字符:char c = str.charAt(6); // 将得到',' 2. 提取字符串:String sub = str.substring(7, 12); // 将得到"World" 注意:字符串索引从0开始,所以第一个字符的索引是0。 另外,需要确保索引在有效范围内(0到str.length()-1),否则会抛出StringIndexOutOfBoundsException。 因此,在提取之前,最好检查索引是否有效。 代码示例: ```java public class ExtractStringExample { public static void main(String[] args) { String str = "Hello, World!"; // 提取索引为6的字符 char charAt6 = str.charAt(6); System.out.println("Character at index 6: " + charAt6); // 输出: , // 提取从索引7到11(不包括12)的子字符串 String substring7to12 = str.substring(7, 12); System.out.println("Substring from index 7 to 12: " + substring7to12); // 输出: World // 如果只给一个参数,则从该索引到末尾 String substring7toEnd = str.substring(7); System.out.println("Substring from index 7 to end: " + substring7toEnd); // 输出: World! // 检查索引是否有效 int index = 15; if (index >= 0 && index < str.length()) { char c = str.charAt(index); System.out.println("Character at index " + index + ": " + c); } else { System.out.println("Index " + index + " is out of bounds!"); } } } ``` 根据用户的问题,他可能只需要单个字符,也可能需要子字符串。所以我们需要根据具体需求选择方法。 如果用户需要提取的是单个字符,使用charAt;如果是一段连续的字符,使用substring。 另外,如果字符串包含Unicode增补字符(即需要两个char表示的字符),则使用charAt可能无法正确提取(因为一个增补字符由两个char表示,即一个代理对)。这时可以考虑使用codePointAt方法,但这种情况较少见,且用户问题中只提到“单个数据”,通常指一个字符或一个子串。如果用户确实需要处理增补字符,则需要更复杂的方法。 但根据常见情况,我们假设用户处理的是普通字符(ASCII或基本多语言平面字符)。 因此,我们提供上述两种方法。 相关问题: 1. 在Java中如何安全地提取字符串中的字符? 2. 如何处理字符串索引越界的问题? 3. 如何提取字符串中的多个不连续字符? 4. 在Java提取字符串有哪些注意事项?</think>### Java字符串特定位置提取单个数据的方法 在 Java提取字符串特定位置的单个数据,主要使用 `charAt()` 方法或 `substring()` 方法。以下是详细说明: #### 1. **使用 `charAt()` 方法提取单个字符** ```java String text = "Java Programming"; char singleChar = text.charAt(5); // 提取索引位置 5 的字符 System.out.println(singleChar); // 输出: P ``` - **说明**: - 索引从 `0` 开始(第一个字符索引为 0) - 直接返回 `char` 类型的字符 - 如果索引越界(如 `text.charAt(100)`),会抛出 `StringIndexOutOfBoundsException` #### 2. **使用 `substring()` 方法提取单个字符(作为字符串)** ```java String text = "Data Extraction"; String singleCharStr = text.substring(5, 6); // 提取索引 5 到 6(不含)的字符 System.out.println(singleCharStr); // 输出: E ``` - **说明**: - 返回类型为 `String`(长度为 1 的字符串) - 参数格式:`substring(beginIndex, endIndex)` - 包含 `beginIndex`,不包含 `endIndex` #### 3. **安全提取(避免索引越界)** ```java int index = 7; String result = (index >= 0 && index < text.length()) ? String.valueOf(text.charAt(index)) : ""; // 越界时返回空字符串 ``` #### 4. **完整示例** ```java public class ExtractCharExample { public static void main(String[] args) { String data = "Hello World"; // 提取第 6 个字符(索引 5) char char1 = data.charAt(5); // 返回 ' ' String char2 = data.substring(5, 6); // 返回 " " System.out.println("charAt 结果: " + char1); System.out.println("substring 结果: " + char2); // 安全提取示例 int targetIndex = 20; if (targetIndex < data.length() && targetIndex >= 0) { System.out.println("安全提取: " + data.charAt(targetIndex)); } else { System.out.println("索引越界!"); } } } ``` #### 关键注意事项: 1. **索引规则**: - 字符串索引从 `0` 开始 - 最后一个字符索引 = `字符串长度 - 1` 2. **方法选择**: - 需要 `char` 类型 → 用 `charAt()` - 需要 `String` 类型 → 用 `substring()` 3. **异常处理**: - 始终检查索引是否在 `[0, length-1]` 范围内 - 使用 `text.length()` 获取字符串长度 #### 进阶技巧: - 提取连续多个字符:`text.substring(2, 5)` → 索引 2 到 4 的字符 - 提取字符串末尾:`text.substring(3)` → 从索引 3 到末尾 - 处理特殊字符:中文字符等占 1 个索引位置(Java 内部使用 UTF-16)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值