字符串和字符
可以通过头部测试一个表达式是不是字符. 字符串的头部总是 String.
所有字符串的头部为 String:
s1<>s2<>… 或 StringJoin[{s1,s2,…}] | 将几个字符串连接在一起 |
StringLength[s] | 给出一个串中的字符数 |
StringReverse[s] | 颠倒串中字符的顺序 |
StringLength 给出串中的字符数:
StringReverse 颠倒串中的字符:
StringTake[s,n] | 由 s 的前 n 个字符形成字符串 |
StringTake[s,{n}] | 取出 s 中的第 n 个字符 |
StringTake[s,{n1,n2}] | 取出 n1 到 n2 的字符 |
StringDrop[s,n] | 在 s 中用截掉前 n 个字符的方式得到字符串 |
StringDrop[s,{n1,n2}] | 截掉从 n1 到 n2 的字符 |
字符串处理中的 StringTake 和 StringDrop 与集合运算中的 Take 和 Drop 类似. 与 Take 和 Drop 相似,它们用 Wolfram 语言标准的排序方式,例如,当n为负数时是从字符串的最后开始计数. 注意,字符串中的第一个字符的位置是 1.
StringInsert[s,snew,n] | 将字符串 snew 插在 s 中的第 n 个位置 |
StringInsert[s,snew,{n1,n2,…}] | 将字符串 snew 多次插入 s 中 |
使用 Riffle 在列表中的词间加入空格:
StringReplacePart[s,snew,{m,n}] | 用字符串 snew 替换 s 中从 m 到 n 的字符 |
StringReplacePart[s,snew,{{m1,n1},{m2,n2},…}] | 用 snew 多次在 s 中进行替换 |
StringReplacePart[s,{snew1,snew2,…},{{m1,n1},{m2,n2},…}] | 用对应的 snewi 替换 s 中的子串 |
StringPosition[s,sub] | 给出 s 中子串 sub 出现的起始和结束位置的列表 |
StringPosition[s,sub,k] | 仅给出 s 中 sub 前 k 次出现的位置列表 |
StringPosition[s,{sub1,sub2,…}] | 给出 subi 中任一个出现的位置 |
用 StringPosition 能给出一个字符串中一个子串出现的位置. StringPosition 的返回值是一个列表,列表中的每一个元素对应于子串的一次出现,它指出了子串的起始和结束位置. 这些列表的形式与 StringTake、StringDrop 和 StringReplacePart 中的形式一致.
StringCount[s,sub] | 计算在 s 中 sub 的出现次数 |
StringCount[s,{sub1,sub2,…}] | 计算任意 subi 出现的次数 |
StringFreeQ[s,sub] | 检测 s 是否不包括 sub |
StringFreeQ[s,{sub1,sub2,…}] | 检测 s 是否不包括所有 subi |
StringContainsQ[s,sub] | test whether s contains sub |
StringContainsQ[s,{sub1,sub2,…}] | test whether s contains any of the subi |
StringStartsQ[s,sub] | test whether s starts with sub |
StringStartsQ[s,{sub1,sub2,…}] | test whether s starts with any of the subi |
StringEndsQ[s,sub] | test whether s ends with sub |
StringEndsQ[s,{sub1,sub2,…}] | test whether s ends with any of the subi |
StringReplace[s,sb->sbnew] | 在 s 中用 sbnew 替换 sb |
StringReplace[s,{sb1->sbnew1,sb2->sbnew2,…}] | 用对应的 sbnewi 替换 sbi |
StringReplace[s,rules,n] | 进行至多 n 次替换 |
StringReplaceList[s,rules] | 给出使用每个单一替换所得到的字符串列表 |
StringReplaceList[s,rules,n] | 给出至多 n 结果 |
StringReplace 可以对一个字符串从左到右扫描进行可能的替换,并返回得到的新字符串. 然而,有时候,查看所有可能的单一替换的结果是有用的. 用户可以使用 StringReplaceList 获得所有结果的列表.
StringSplit[s] | 把 s 根据空格符分界分成子串组 |
StringSplit[s,del] | 在分界符 del 的位置上分组 |
StringSplit[s,{del1,del2,…}] | 在任意 deli 的位置上分组 |
StringSplit[s,del,n] | 分成至多 n 个子串组 |
StringSplit[s,del->rhs] | 在每个分解符位置上插入 rhs |
StringSplit[s,{del1->rhs1,del2->rhs2,…}] | 在对应的 deli 位置上插入 rhsi |
Sort[{s1,s2,s3,…}] | 对字符串列表排序 |
Sort 根据标准字典顺序对字符串进行排序:
StringTrim[s] | 从 s 的开头和结尾删除空格 |
StringTrim[s,patt] | 从开头和结尾删除与 patt 匹配的子串 |
SequenceAlignment[s1,s2] | 寻找 s1 和 s2 的最优对齐法 |
Characters["string"] | 将字符串转换为一个字符列表 |
StringJoin[{"c1","c2",…}] | 将一个字符集合转换为一个字符串 |
StringJoin 将给定的字符列表转换为字符串:
DigitQ[string] | 测试串中的所有字符是否是数字 |
LetterQ[string] | 测试串中的所有字符是否是字母 |
UpperCaseQ[string] | 测试串中的所有字符是否是大写字母 |
LowerCaseQ[string] | 测试串中的所有字符是否是小写字母 |
串中的有些字符不是大写,所有测试结果为 False:
ToUpperCase[string] | 产生一个所有字母都是大写的字符串 |
ToLowerCase[string] | 产生一个所有字母都是小写的字符串 |
CharacterRange["c1","c2"] | 产生一个从 c1 到 c2 的字符列表 |
字符串操作函数如 StringReplace 的一个重要特征是它们不仅能够处理由字母组成的字符串,也能处理由字符串集合组成的模式.
s1~~s2~~… 或 StringExpression[s1,s2,…] | |
由字符串和模式对象组成的序列 |
StringMatchQ["s",patt] | 测试 "s" 是否与 patt 匹配 |
StringFreeQ["s",patt] | 测试 "s" 是否不含有与 patt 匹配的子串 |
StringContainsQ["s",patt] | 测试 "s" 是否包含与 patt 匹配的子字符串 |
StringStartsQ["s",patt] | 测试 "s" 是否以与 patt 匹配的子字符串开头 |
StringEndsQ["s",patt] | 测试 "s" 是否以与 patt 匹配的子字符串结尾 |
StringCases["s",patt] | 给出与 patt 匹配的子串 "s" 的列表 |
StringCases["s",lhs->rhs] | 用 rhs 替换每个 lhs |
StringPosition["s",patt] | 给出与 patt 匹配的子串的位置列表 |
StringCount["s",patt] | 计算有多少子串与 patt 匹配 |
StringReplace["s",lhs->rhs] | 替换与 lhs 匹配的每个子串 |
StringReplaceList["s",lhs->rhs] | 给出所有替换 lhs 的方法列表 |
StringSplit["s",patt] | 在每个与 patt 匹配的子串处分解 s |
StringSplit["s",lhs->rhs] | 在 lhs 处分解,并在该位置插入 rhs |
"string" | 由字符组成的字符串 |
_ | 任意单个字符 |
__ | 由一个或多个字符组成的任意序列 |
___ | 由 0 个或多个字符组成的任意序列 |
x_
,
x__
,
x___ | 名称有 x 的子串 |
x:pattern | 名称为 x 的模式 |
pattern.. | 重复 1 次或多次的模式 |
pattern... | 重复 0 次或多次的模式 |
{patt1,patt2,…} 或 patt1patt2… | 与至少一个 patti 匹配的模式 |
patt/;cond | cond 等于 True 的模式 |
pattern?test | 对每个字符 test 等于 True 的模式 |
Whitespace | 空格字符组成的序列 |
NumberString | 数字字符串 |
charobj | 表示字符类的对象(参见下面的讨论) |
RegularExpression["regexp"] | 与规则表达式匹配的子串 |
{"c1","c2",…} | 任意 "ci" |
Characters["c1c2…"] | 任意 "ci" |
CharacterRange["c1","c2"] | 在 "c1" 到 "c2" 范围内的任意字符 |
DigitCharacter | 数字 0–9 |
LetterCharacter | 字母 |
WhitespaceCharacter | 空白、换行、tab或其他空格字符 |
WordCharacter | 字母或数字 |
Except[p] | 除了与 p 匹配的任意字符 |
ToExpression 把它们转换为普通的符号和数字:
字符串模式通常应用于一个给定字符串中任何位置出现的子串. 然而,有时,指定只能用于特定位置子串的模式是方便的. 这可以通过在字符串模式中包含符号如 StartOfString 来实现.
StartOfString | 整个字符串的开头 |
EndOfString | 整个字符串的末尾 |
StartOfLine | 行的开头 |
EndOfLine | 行的末尾 |
WordBoundary | 在词字符和其他之间的分界 |
Except[StartOfString]
, etc.
| 除了特定位置如 StartOfString 等的其他任何位置 |
当在一个字符串模式中给出一个对象,如 x__ 或 e..,Wolfram 语言自动假设用户想要它匹配最长可能字符序列. 然而,有时,用户可能想要匹配的是最短可能字符序列. 这可以使用 Shortest[p] 指明.
Shortest 指明用户要寻找的是最短可能匹配:
IgnoreCase->True | 同等对待大小写字母 |
StringPosition 默认情况下包含重叠:
Wolfram 语言的一般模式提供了进行字符串操作的强大方法. 但是如果对专门的字符串操作语言熟悉的话,有时可能会发现使用规则表达式 记号指明字符串模式是方便的. 在 Wolfram 语言中可以使用 RegularExpression 对象实现.
RegularExpression["regex"] | 由 "regex" 指定的规则表达式 |
RegularExpression 在 Wolfram 语言中支持所有标准规则表达式结构.
c | 字母字符 c |
. | 除了新的一行以外的任何字符 |
[c1c2…] | 任何 ci 字符 |
[c1-c2] | 在 c1–c2 范围内的任何字符 |
[^c1c2…] | 除了 ci 的任何字符 |
p* | 重复0次或多次的 p |
p+ | 重复1次或多次的 p |
p? | 出现0次或1次的 p |
p{m,n} | 重复 m 到 n 次之间的 p |
p*?
,
p+?
,
p?? | 最短的符合匹配条件的一致字符串 |
(p1p2…) | 与序列 p1p2… 匹配的字符串 |
p1p2 | 与 p1 或 p2 匹配的字符串 |
. | _
(严格上,
Except["∖n"]
)
|
[c1c2…] | Characters["c1c2…"] |
[c1-c2] | CharacterRange["c1","c2"] |
[^c1c2…] | Except[Characters["c1c2…"]] |
p* | p... |
p+ | p.. |
p? | p "" |
p*?
,
p+?
,
p?? | Shortest[p…],… |
(p1p2…) | (p1~~p2~~…) |
p1p2 | p1p2 |
\\d | 数字 0–9(DigitCharacter ) |
\\D | 非数字(Except[DigitCharacter]) |
\\s | 空格、换行、tab 或其他空格字符(WhitespaceCharacter) |
\\S | 非空格字符(Except[WhitespaceCharacter]) |
\\w | 词字符(字母、数字或 _)(WordCharacter) |
\\W | 非词字符(Except[WordCharacter]) |
[[:class:]] | 位于命名类中的字符 |
[^[:class:]] | 不位于命名类中的字符 |
Wolfram 语言支持标准 POSIX 字符类 alnum、alpha、ascii、blank、cntrl、digit、graph、lower、print、punct、space、upper、word 和 xdigit.
^ | 字符串的开头 (StartOfString) |
$ | 字符串的末尾 (EndOfString) |
\\b | 词边界(WordBoundary) |
\\B | 除了词边界的任何位置 (Except[WordBoundary]) |
在一般的 Wolfram 语言模式中,可以使用例如 x_ 和 x:patt 等结构来对匹配的对象给出任意的名字. 在规则表达式中,可以使用如下方法处理序列号:在一个规则表达式中第 n 个带括号的模式对象 (p) 在模式内为 \\n,而在模式外为$n.
在 Wolfram 语言的笔记本中,像 等特殊字符直接显示. 但是在用文本界面时,容易显示的字符就是在键盘上所出现的字符. 显示哪些特殊字符从 $CharacterEncoding 的值推断出来.
Wolfram 语言笔记本中用 StandardForm,特殊字符可以直接显示:
在 OutputForm 中,特殊字符在可能时就用相近的一般字符代替:
在 InputForm 或者 FullForm 中,无法估计特殊字符. Wolfram 语言对于 InputForm 格式下的可表示的特殊字符使用全名,而 FullForm 总使用长名,甚至用于笔记本界面.
在 FullForm 中,所有特殊字符使用长名写出:
默认情况下,当保存笔记本和程序包时,Wolfram 系统使用字符编码 "PrintableASCII". 这意味着当特殊字符写入文件或者外部程序时,它们完全表示为普通字符组成的序列. 这种统一的表示法在允许 Wolfram 语言中特殊字符用不依赖于特定计算机系统细节的使用方法是重要的.
应该认识到,虽然有可能通过原来的 tab 和换行获得 Wolfram 语言输出的一些格式,但这基本上在很少情况下是个好办法. 通常,一个更好的办法是使用高级的 Wolfram 语言原始格式,可参见 "面向字符串的输出格式","数字的输出格式",和 "表与矩阵". 这些原始格式将总是产生一致的输出,不论在一个特定的设备中tab设置的位置.
前端格式结构 Column 给出了更多的控制. 以下文本是右对齐:
ToCharacterCode["string"] | 给出一个字符串中字符代码的列表 |
FromCharacterCode[n] | 由代码产生字符 |
FromCharacterCode[{n1,n2,…}] | 由一个字符代码列表产生一个字符串 |
FromCharacterCode 给出原来的字符串:
CharacterRange["c1","c2"] | 用相连的字符代码产生一个字符集合 |
对常用的数学符号和标准的欧洲语言中的符号,Wolfram 语言都为它们给出了名称. 但是对于日文、中文和韩文,它们有上千个其他字符,Wolfram 语言并没有对它们的每个字符分配明确的名称,但是用标准化的字符代码来引用这些字符.
在 FullForm 中,这些字符用标准字符代码表示. 这些字符代码是十六进制数字:
对于代码在 256 之内的字符,可以用 \.nn 输入. 对于代码在 256 之上的字符,必须用 \:nnnn 或 \nnnnnn 输入. 注意,在任何情况下必须给出确定位数的八进制或十六进制字符,必要时在前面添0.
在给字符指定代码时,Wolfram 语言遵循了与三个标准兼容的原则:ASCII、ISO Latin‐1 和 Unicode. ASCII 覆盖了所有美式英语键盘上出现的字符. ISO Latin‐1 覆盖了在许多欧洲语言中出现的字符. Unicode 是一个更一般的标准,它为世界上语言和记号中使用的几万种字符定义了代码.
0–127 (∖.00–∖.7f) | ASCII 字符 |
1–31 (∖.01–∖.1f) | ASCII 控制字符 |
32–126 (∖.20–∖.7e) | 可显示的 ASCII 字符 |
97–122 (∖.61–∖.7a) | 小写英语字母 |
129–255 (∖.81–∖.ff) | ISO Latin‐1 字符 |
192–255 (∖.c0–∖.ff) | 在欧洲语言中出现的字母 |
0–59391 (∖:0000–∖:e7ff) | Unicode 标准共用字符 |
913–1009 (∖:0391–∖:03f1)
| 希腊字母 |
12288–35839 (∖:3000–∖:8bff)
| 中文、日文和韩文字符 |
8450–8504 (∖:2102–∖:2138)
| 修改后在数学记号中使用的字母 |
8592–8677 (∖:2190–∖:21e5)
| 箭头 |
8704–8945 (∖:2200–∖:22f1)
| 数学符号及运算 |
61440–63487 (∖:f000–∖:f7ff)
| 由 Wolfram 语言特殊定义的 Unicode 专用字符 |
$CharacterEncoding=None | 对所有特殊字符使用可显示的 ASCII 名称 |
$CharacterEncoding="name" | 使用由 name 指定的字符的原始代码 |
$SystemCharacterEncoding | 特定计算机系统的默认原始字符代码 |
Wolfram 语言的笔记本前端对所使用的字形将自动设置合适的字符编码. 但在文本界面或通过文件等途径使用 Wolfram 语言时,就需要明确地设置 $CharacterEncoding.
通过对 $CharacterEncoding 指定一个合适的值,就能使 Wolfram 语言处理不同编辑器或操作系统所产生的原始文本.
"PrintableASCII" | 仅限于可显示的 ASCII 字符(默认) |
"ASCII" | 包括控制字符的所有 ASCII 字符 |
"ISOLatin1" | 常用的西欧语言字符 |
"ISOLatin2" | 中欧及东欧语言字符 |
"ISOLatin3" | 另外的欧洲语言字符(如卡泰兰、土尔其) |
"ISOLatin4" | 其余的欧洲语言字符(如艾托尼亚、南普斯) |
"ISOLatinCyrillic" | 英语及苏黎士语言字符 |
"AdobeStandard" | Adobe 标准邮电码 |
"MacintoshRoman" | Macintosh 罗马字符编码 |
"WindowsANSI" | Windows 标准字形码 |
"Symbol" | 符号字形编码 |
"ZapfDingbats" | Zapf dingbats 字形编码 |
"ShiftJIS" | 日语 shift‐JIS(8 位与 16 位混用) |
"EUC" | 扩展的 Unix 日语编码(8 位与 16 位混用) |
"UTF‐8" | Unicode 转换格式编码 |
Mathematica 知道适应于不同计算机系统和不同语言的各种原始字符编码. 当指定了一种编码后,Wolfram 语言就可以以原始形式给出包含在这个原始编码中任何字符的编码. 但没有包含在这个编码中的字符仍按标准的 Wolfram 语言全名或十六进制编码给出.
当写入或读入文本文件时,Wolfram 语言内核可以使用您所指定的任何字符编码. 默认情况下,Put 和 PutAppend 对 Wolfram 语言语言文件从一个系统到另一个的可移植性产生 ASCII 表示法.
ToCharacterCode["string"] | 用标准 Wolfram 语言编码产生字符码 |
ToCharacterCode["string","encoding"] | 用指定的编码产生字符码 |
FromCharacterCode[{n1,n2,…}] | 从 Wolfram 语言的标准代码产生字符 |
FromCharacterCode[{n1,n2,…},"encoding"] | |
用指定的编码产生字符 |
以下用 Windows 的标准编码给出了字符的代码,在这种编码中,∖[Pi] 没有代码:
Wolfram 语言内部使用的字符代码基于 Unicode. 但是,作为默认状态,Wolfram 语言外部总使用 ∖[Name] 或∖:nnnn 等简单的ASCII序列去代表特殊字符. 通过让 Wolfram 语言使用原始 "Unicode" 字符编码,就可以使 Wolfram 语言用十六进制 Unicode 形式去读写字符.