目录
一.每次替换从 1 个字符变成 3 个字符
class Solution
{
public String replaceSpace(String s)
{
int length = s.length();
char[] array = new char[length * 3];
int size = 0;
for (int i = 0; i < length; i++)
{
char c = s.charAt(i);
if (c == ' ')
{
array[size++] = '%';
array[size++] = '2';
array[size++] = '0';
}
else
{
array[size++] = c;
}
}
String newStr = new String(array, 0, size);
return newStr;
}
}
二.正则表达式
return s.replace(/\s/g, '%20')
1.基础
①/[Pp]ython/g:匹配中括号里的元素任意一个
Python python Ppython
② /[0-9]/g (快捷方式:/\d/g) :匹配数字
/[a-z]/g /[A-Z]/g:小写字母,大写字母
/[^0-9]/g:不会匹配数字(^放区间是取反,快捷方式:/\D/g)
③ /\-/g:匹配横杠
④/\bmaster\b/g:单词边界
amaster-master 123 -xxx master"mastae
⑤/^python/g:匹配以python开头的数据
/python$/g:匹配以python结尾的数据
⑥/....../g:匹配任意字符(不能匹配换行符)
python
⑦/honu?r/g:u可出现可不出现
honur honr
⑧/\d{9}/g:匹配9个前面的数字
123 123456789
/\d{8,9}/g:匹配8个或9个前面的数字
/\d{8,9}?/g:?是非贪婪模式。令前面的标记慵懒,使其尽可能少的匹配字符
/\d{3,}/g:匹配3个以上的数字
快捷方式:/\d+/g == /\d{1,}/g(1个到无数个)
/\d*/g == /\d{0,}/g(0个到无数个)
2.进阶
①捕获分组
/(\d{4})-(\d{6})/g:()被称为捕获分组。从匹配好的数据中提取关键数据
0731-828333
②非捕获分组
(?:表达式)
③回溯引用
HTML代码:0123<font>提示</font>abcd
/<\w+>.*?</\1>/g
④先行断言:从左往右看
1>正向先行断言
(?=表达式):所在位置右侧必须能匹配表达式
/喜欢(?=你)/g
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
2>反向先行断言
(?!表达式):保证右边不能出现某字符
/喜欢(?!你)/g
我喜欢你 我喜欢 我喜欢我 喜欢
⑤后行断言:从右往左看
1>正向后行断言
(?<=表达式):从某个位置向左看,所在位置左侧必须能匹配表达式
/(?<=我)喜欢(?=你)/g
我喜欢你 喜欢你 我喜欢我自己
2>反向后行断言
(?<!表达式):所在位置左侧不能匹配表达式
/(?<!我)喜欢(?!你)/g
我喜欢你 喜欢你 喜欢 我喜欢我自己
三.C++ earse()和insert()函数
//s.erase(pos,n):删除从pos开始的n个字符
//s.erase(pos):删除pos处的一个字符(pos是string类型的迭代器)
//s.insert(pos,str):在原串下标为pos的字符前插入字符串str
//s.insert(pos, str, pos1, n):str从下标为pos1开始数的n个字符插在原串下标为pos的字符前
//s.insert(pos, n, c):在原串下标为pos的字符前插入n个字符c
class Solution
{
public:
string replaceSpace(string s)
{
for(int i = 0;s[i]!='\0'; i++)
{
if(s[i] == ' ')
{
s.erase(i,1); // 删除i之后的1个字符
s.insert(i,"%20"); //在i的后面插入字符串
i +=2; // +2 然后循环 +1 = +3
}
}
return s;
}
};
四.C++ replace()函数
//s.replace():在字符串中用一些字符替换另一些字符
class Solution
{
public:
string replaceSpace(string s)
{
int n = string::npos;
while((n = s.find(' ')) != string::npos)
{
s.replace(n, 1, "%20");
}
return s;
}
};