当前位置:   article > 正文

16、字符串_u202f

u202f

1、String

String 是不可变的,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全新的 String 对象,以包含修改后的字符串内容。而最初的 String 对象则丝毫未动。

对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。

1.1、StringBuilder 与 + 重载的对比

使用StringBuilder的相关操作会更好,+内部也会使用StringBuilder

1.2 、对象的内存地址

如果你真的想要打印对象的内存地址,应该调用 Object.toString() 方法,这才是负责此任务的方法。所以,不要使用 this,而是应该调用 super.toString() 方法。this 会调用该类的toString(),造成循环调用。

1.3 String的操作

方法作用
构造方法创建String对象
getChars​,getBytes复制char或byte到一个目标数组中
toCharArray生成一个char[],包含String中的所有字符
equals,equalsIgnoreCase比较两个String的内容是否相同。如果相同,结果为true
compareTo,compareToIgnoreCase按词典顺序比较String的内容,比较结果为负数、零或正数。
contentEquals如果该String对象与参数的内容完全一致,则返回true
contains如果该String对象包含参数的内容,则返回true
regionMatches返回boolean结果,以表明所比较区域是否相等
startsWith,endsWith判断前后缀
indexOf,lastIndexOf如果该String并不包含此参数,就返回-1;否则返回此参数在String中的起始索引。lastIndexOf()是从后往前搜索
matches返回boolean结果,以表明该String和给出的正则表达式是否匹配
split按照正则表达式拆分String,返回一个结果数组
join用分隔符拼接字符片段,产生一个新的String
substring返回一个新的String对象,以包含参数指定的子串
concat返回一个新的String对象,内容为原始String连接上参数String
replace,replaceFirst, replaceAll替换
trim去掉了所有前后空格后的字符串,其中空格定义为codepoint小于或等于’U+0020’(空格字符)的任何字符。

1.4 格式化输出

2、正则表达式

字符

构建格式匹配的内容
x字符x
\\反斜杠
\xhh十六进制值为0xhh的字符
\uhhhh十六进制表现为0xhhhh的字符
\N{name}Unicode名为’name’的字符
\t水平制表符(’\u0009’)
\n换行字符(‘\u000A’)
\r回车符(‘\u000D’)
\f换页符(’\u000C’)
\e转义符(’\u001B’)

字符类

构建格式匹配的内容
[abc]包含a,b或c的字符
[^abc]不包含a,b或c的任意字符(否定)
[a-zA-Z]a-z或A-Z之间的字符(范围),该式子表示匹配任意英文字母
[a-b[m-p]]a-b或m-p之间的字符(联合),也可以写成[a-bm-p]
[a-z&&[def]]d,e或f
[a-z&&[^bc]]等价于ad-z
[a-z&&[^m-p]]等价于[a-lq-z]

预定义字符类

预定义字符匹配
.任意字符
\d数字:[0-9]
\D非数字:[^0-9]
\h水平空白符:[ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H非水平空白符:[^\h]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符: [^\s]
\v垂直空白字符: [\n\x0B\f\r\x85\u2028\u2029]
\V非垂直空白符:[^\v]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]

逻辑操作符

逻辑操作符含义
XYY跟在X后面
X|YX或者Y
(X)捕获组(capturing group)。可以在表达式中用\i引用第i个捕获组

边界匹配符

边界匹配含义
^匹配行的开始
$匹配行的结束
\b单词边界
\B边界单词
\G前一个匹配结束
\A输入的开始
\z输入的结束
\ZThe end of the input but for the final terminator, if any

量词(quantifiers)

  • 贪婪型(greedy):量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配。
  • 勉强型(reluctant): 用问号来指定,这个量词匹配满足模式所需的最少字符数。因此也被称作懒惰的、最少匹配的、非贪婪的或不贪婪的。
  • 占有型(progressive):目前,这种类型的量词只有在 Java 语言中才可用(在其他语言中不可用),并且也更高级,因此我们大概不会立刻用到它。当正则表达式被应用于 String 时,它会产生相当多的状态,以便在匹配失败时可以回溯。而“占有型”量词并不保存这些中间状态,因此它们可以防止回溯。它们常常用于防止正则表达式失控,因此可以使正则表达式执行起来更高效。
贪婪型勉强型占有型匹配
X?X??X?+0个或1个X
X*X*?X*+0个或多个X
X+X+?X++1个或多个X
X{n}?X{n}??X{n}++恰好匹配n次X
X{n,}?X{n,}??X{n,}++至少匹配n次X
X{n,n}?X{n,n}??X{n,n}++至少匹配n次,至多匹配m次X

表达式 X 通常必须要用圆括号括起来,以便它能够按照我们期望的效果去执行。

Pattern 和 Matcher

Pattern pattern = Pattern.compile("regex"[flag]);
Matcher matcher = pattern.matcher(pattern);
  • 1
  • 2

Matcher

方法
matches尝试根据模式匹配整个输入序列
lookingAt尝试根据模式匹配输入序列(从开头开始),它不需要匹配整个区域
find尝试查找与该模式匹配的输入序列的下一个子序列find()、find(int)
start返回上一个匹配的起始索引start()、start(int)、start(string)
end返回上一个匹配的结束索引+1end()、end(int)、end(string)

组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为 0 表示整个表达式,组号 1 表示被第一对括号括起来的组,以此类推。

方法
groupCount()返回该匹配器的模式中的分组数目,组 0 不包括在内。
group()返回前一次匹配操作(例如 find())的第 0 组(整个匹配)
group(int)返回前一次匹配操作期间指定的组号,如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,则将返回 null。

Pattern 标记

UNIX_LINES (?d)在这种模式下,在.、^和$的行为中,只识别行终止符\n。 也可以通过嵌入的标志表达式(?d)启用。
CASE_INSENSITIVE(?i)默认情况下,大小写不敏感的匹配假定只有US-ASCII字符集中的字符才能进行。这个标记允许模式匹配不考虑大小写(大写或小写)。通过指定UNICODE_CASE标记及结合此标记。基于Unicode的大小写不敏感的匹配就可以开启了
UNICODE_CASE(?u)当指定这个标记,并且开启CASE_INSENSITIVE时,大小写不敏感的匹配将按照与Unicode标准相一致的方式进行。默认情况下,大小写不敏感的匹配假定只能在US-ASCII字符集中的字符才能进行
COMMENTS(?x)在这种模式下,空格符将被忽略掉,并且以#开始直到行末的注释也会被忽略掉。通过嵌入的标记表达式也可以开启Unix的行模式
MULTILINE(?m)在多行模式下,表达式^和 分 别 匹 配 一 行 的 开 始 和 结 束 。 还 匹 配 输 入 字 符 串 的 开 始 , 而 分别匹配一行的开始和结束。^还匹配输入字符串的开始,而 还匹配输入字符串的结尾。默认情况下,这些表达式仅匹配输入的完整字符串的开始和结束
LITERAL当指定此标志时,指定模式的输入字符串将被视为文字字符序列。输入序列中的元字符或转义序列没有特殊意义。当将CASE_INSENSITIVE和UNICODE_CASE标志与该标志一起使用时,它们对匹配的影响仍然存在。其他的标志则变得多余。
DOTALL(?s)在dotall模式下,表达式.匹配所有字符,包括行终止符。默认情况下,.不会匹配行终止符
CANON_EQ当且仅当两个字符的完全规范分解相匹配时,才认为它们是匹配的。例如,如果我们指定这个标记,表达式\u003F就会匹配字符串?。默认情况下,匹配不考虑规范的等价性

split

split()方法将输入 String 断开成 String 对象数组,断开边界由正则表达式确定

String[] split(CharSequence input) 
String[] split(CharSequence input, int limit)
  • 1
  • 2
  • 如果limit为正,那么匹配limit-1次
  • 如果limit为0,那么会尽可能匹配所有结果,但是末尾的空字符串会被丢弃
  • 如果limit为负,那么会尽可能匹配所有结果,包括末尾的空格字符

替换操作

使用正则表达式替换文本非常方便。

  • replaceFirst(String replacement) 以参数字符串 replacement 替换掉第一个匹配成功的部分。
  • replaceAll(String replacement) 以参数字符串 replacement 替换所有匹配成功的部分。
  • appendReplacement(StringBuffer sbuf, String replacement) 执行渐进式的替换,而不是像 replaceFirst() 和 replaceAll() 那样只替换第一个匹配或全部匹配。允许调用其他的方法来处理生成的replacement(replaceFirst() 和 replaceAll() 则只能使用一个固定的字符串),这样可以使你能够以编程的方式将目标分割成组,从而具备更强大的替换功能。
  • appendTrail():执行一次或多次appendReplacement() 之后,调用此方法可以将输入字符串余下的部分复制到 sbuf 中。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.*;
import java.nio.file.*;
/*! Here's a block of text to use as input to 
    the regular expression matcher. Note that we 
    first extract the block of text by looking for 
    the special delimiters, then process the     
    extracted block. !*/
public class TheReplacements {
    public static void main(String[] args) throws Exception {
        String s = Files.lines(Paths.get("TheReplacements.java")).collect(Collectors.joining("\n"));
        //匹配上面的注释,需要打开dotall模式
        Matcher mInput = Pattern.compile("/\\*!(.*)!\\*/",Pattern.DOTALL).matcher(s);
        if (mInput.find()) {
            //返回第一个捕获组,及时上面表达式中(.*)匹配到的内容
            s = mInput.group(1);
        }
        //将两个或两个以上的空格替换为一个空格
        s = s.replaceAll(" {2,}", " ");
        //把每一行开头的空格去掉,需要打开多行模式
        s = s.replaceAll("(?m)^ +", "");
        System.out.println(s);

        s = s.replaceFirst("[aeiou]", "(VOWEL1)");
        StringBuffer sbuf = new StringBuffer();     
        Pattern p = Pattern.compile("[aeiou]");
        Matcher m = p.matcher(s);
        //把元音字母大写
        while (m.find()) {
            m.appendReplacement(sbuf, m.group().toUpperCase());
        }
        m.appendTail(sbuf);
        System.out.println(sbuf);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

输出结果:

Here’s a block of text to use as input to
the regular expression matcher. Note that we
first extract the block of text by looking for
the special delimiters, then process the
extracted block.
H(VOWEL1)rE’s A blOck Of tExt tO UsE As InpUt tO
thE rEgUlAr ExprEssIOn mAtchEr. NOtE thAt wE
fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr
thE spEcIAl dElImItErs, thEn prOcEss thE
ExtrActEd blOck.

reset

通过 reset() 方法,可以将现有的 Matcher 对象应用于一个新的字符序列

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/865577
推荐阅读
相关标签
  

闽ICP备14008679号