正则表达式使用过程中的一个问题

问题描述

在对一个字符串进行正则匹配,然后替换匹配项的时候,在调用Matcher的appendReplacement()方法的时候,发现报IllegalArgumentException错误。

这个问题随着字符串的不同,有时候出现,有时候不出现。

问题分析

根据问题的描述,可以比较肯定的是船体的字符串的内容对其产生了影响。具体怎么产生影响的,却不是很清楚。

随后想到直接查看JDK的源码,发现在Matcher的appendReplacement()方法中有这么一段。

public Matcher appendReplacement(StringBuffer sb, String replacement) {

        // If no match, return error
        if (first < 0)
            throw new IllegalStateException("No match available");

        // Process substitution string to replace group references with groups
        int cursor = 0;
        String s = replacement;
        StringBuffer result = new StringBuffer();

        while (cursor < replacement.length()) {
            char nextChar = replacement.charAt(cursor);
            if (nextChar == '\\') {
                cursor++;
                nextChar = replacement.charAt(cursor);
                result.append(nextChar);
                cursor++;
            } else if (nextChar == '$') {
                // Skip past $
                cursor++;

                // The first number is always a group
                int refNum = (int)replacement.charAt(cursor) - '0';
                if ((refNum < 0)||(refNum > 9))
                    throw new IllegalArgumentException(
                        "Illegal group reference");
                cursor++;

                // Capture the largest legal group string
                boolean done = false;
                while (!done) {
                    if (cursor >= replacement.length()) {
                        break;
                    }
                    int nextDigit = replacement.charAt(cursor) - '0';
                    if ((nextDigit < 0)||(nextDigit > 9)) { // not a number
                        break;
                    }
                    int newRefNum = (refNum * 10) + nextDigit;
                    if (groupCount() < newRefNum) {
                        done = true;
                    } else {
                        refNum = newRefNum;
                        cursor++;
                    }
                }

                // Append group
                if (group(refNum) != null)
                    result.append(group(refNum));
            } else {
                result.append(nextChar);
                cursor++;
            }
        }

        // Append the intervening text
        sb.append(getSubSequence(lastAppendPosition, first));
        // Append the match substitution
        sb.append(result.toString());

        lastAppendPosition = last;
	return this;
    }

根据这段源码猜测,可能是在appendReplacement()方法的第二个参数中,可以利用$符号对匹配的组别进行引用。

再查JDK的API,发现:

The replacement string may contain references to subsequences captured during the previous match: Each occurrence of$g will be replaced by the result of evaluating group(g). The first number after the $ is always treated as part of the group reference. Subsequent numbers are incorporated into g if they would form a legal group reference. Only the numerals '0' through '9' are considered as potential components of the group reference. If the second group matched the string "foo", for example, then passing the replacement string "$2bar" would cause "foobar" to be appended to the string buffer. A dollar sign ($) may be included as a literal in the replacement string by preceding it with a backslash (\$).

大概的意思就是在appendReplacement()方法的第二个参数中可用$符号可以对组别进行引用,和前面分析的基本一致。

问题解决

有了上面的分析和API说明,应该很好解决问题了,在进行字符串匹配之前,先进行字符的替换:

str = str.replace("$", "\\$");

这样就解决了这个问题。

总结

通过这个问题,发现了自己对于JDK的API还是不够熟练,因为API中已经明确说明$符号要进行转义。

另外,这种解决问题的思路还是可以借鉴的,不要惧怕源码!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 正则表达式在编程主要用于字符串匹配和模式识别。它可以被用于验证输入的有效性,如邮件地址、电话号码等;还可以用于搜索和替换文本的内容,以及从大量文本数据提取有用信息。 常用编程语言,如 Python、Java、C++ 等都内置了正则表达式库,开发者可以直接调用这些库的函数实现正则表达式的功能。 例如在 Python ,可以使用 `re` 库的 `re.search` 函数在字符串搜索符合正则表达式的内容,以下是一个简单的例子: ```python import re text = "My phone number is 123-456-7890" phone_number_regex = r'\d{3}-\d{3}-\d{4}' match = re.search(phone_number_regex, text) if match: print("Phone number found:", match.group()) else: print("Phone number not found") ``` 输出结果: ``` Phone number found: 123-456-7890 ``` ### 回答2: 正则表达式是一种用来匹配字符串模式的工具,能够帮助快速有效地在文本搜索、替换、验证和提取字符串。在编程,可以通过正则表达式来实现以下功能: 1. 搜索匹配:使用正则表达式可以在字符串快速搜索匹配指定模式的文本。比如,可以使用正则表达式搜索一个字符串是否存在某个特定的单词或字符序列。 2. 替换文本:正则表达式还可以用来替换字符串匹配到的文本。通过指定一个正则表达式和替换字符串,可以将匹配到的文本快速替换为指定的内容。 3. 字符串验证:正则表达式也可以用来验证一个字符串是否符合特定的模式。比如,可以使用一个正则表达式验证一个字符串是否符合电话号码的格式。 4. 提取数据:使用正则表达式可以从字符串提取出符合特定模式的数据。比如,可以使用正则表达式提取一个字符串的所有数字或Email地址。 5. 校验输入:在输入验证方面,正则表达式可以用来校验用户输入的数据。比如,我们可以使用正则表达式来验证用户输入的邮箱地址或密码是否符合要求。 总之,正则表达式是一种强大、灵活且广泛应用于编程的工具。掌握正则表达式使用可以极大地提高处理字符串的效率和准确性。 ### 回答3: 正则表达式(Regular Expression)在编程被广泛使用,用于处理和匹配文本数据。它是一种强大的字符串匹配和替换工具,具有简洁高效的特点。 在编程正则表达式可以用于以下场景: 1. 文本匹配:通过正则表达式可以根据规则匹配特定模式的文本,比如检查字符串是否符合特定的格式要求。例如,可以使用正则表达式验证一个电话号码是否是有效的手机号。 2. 字符串替换:正则表达式可以替换文本字符串的某些部分。例如,可以使用正则表达式一个文本所有的邮箱地址替换为特定的字符串。 3. 数据提取:在文本提取特定的信息。正则表达式可以帮助我们从一个字符串提取出需要的数据,如提取出一个网页的所有链接。 4. 输入验证:在编程过程,可以使用正则表达式验证用户输入的合法性。例如,可以使用正则表达式验证用户输入的密码是否符合规定的复杂度要求。 5. 日志分析:在大规模数据正则表达式可以帮助我们快速定位和提取所需要的信息。例如,在服务器日志,可以使用正则表达式提取出指定时间段内的错误信息。 总而言之,正则表达式是编程非常有用的工具,能够帮助我们快速处理和匹配文本数据。在不同编程语言,都有内置的正则表达式库,可以轻松地调用和运用。掌握正则表达式的基本语法和应用技巧,对于编程工作和文本处理非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值