JavaScript RegExp 正则表达式

描述

字面量和构造函数

有两种方法可以创建一个 RegExp 对象:一种是字面量,另一种是构造函数。

  • 字面量

    由斜杠(/)包围而不是引号包围。

  • 构造函数的字符串参数

    由引号而不是斜杠包围。

以下三种表达式都会创建相同的正则表达式:

/ab+c/i; //字面量形式
new RegExp('ab+c', 'i'); // 首个参数为字符串模式的构造函数
new RegExp(/ab+c/, 'i'); // 首个参数为常规字面量的构造函数

当表达式被赋值时,字面量形式提供正则表达式的编译(compilation)状态,当正则表达式保持为常量时使用字面量。例如当你在循环中使用字面量构造一个正则表达式时,正则表达式不会在每一次迭代中都被重新编译(recompiled)。

而正则表达式对象的构造函数,如 new RegExp('ab+c') 提供了正则表达式运行时编译(runtime compilation)。如果你知道正则表达式模式将会改变,或者你事先不知道什么模式,而是从另一个来源获取,如用户输入,这些情况都可以使用构造函数。

构造函数中的标志参数(flags)

从 ECMAScript 6 开始,当第一个参数为正则表达式而第二个标志参数存在时,new RegExp(/ab+c/, 'i') 不再抛出 TypeError"从另一个RegExp构造一个RegExp时无法提供标志")的异常,取而代之,将使用这些参数创建一个新的正则表达式。

当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)。

比如,以下是等价的:

var re = new RegExp("\\w+");
var re = /\w+/;

构造函数

  • RegExp()

    创建一个新的 RegExp 对象。

静态属性

  • get RegExp[@@species\]

    该构造函数用于创建派生对象。

  • RegExp.lastIndex

    该索引表示从哪里开始下一个匹配

实例属性

  • RegExp.prototype.flags

    含有 RegExp 对象 flags 的字符串。

  • RegExp.prototype.dotAll

    . 是否要匹配新行(newlines)。

  • RegExp.prototype.global

    针对字符串中所有可能的匹配项测试正则表达式,还是仅针对第一个匹配项。

  • RegExp.prototype.ignoreCase

    匹配文本的时候是否忽略大小写。

  • RegExp.prototype.multiline

    是否进行多行搜索。

  • RegExp.prototype.source

    正则表达式的文本。

  • RegExp.prototype.sticky

    搜索是否是 sticky。

  • RegExp.prototype.unicode

    Unicode 功能是否开启。

实例方法

  • RegExp.prototype.compile()

    运行脚本的期间(重新)编译正则表达式。

  • RegExp.prototype.exec()

    在该字符串中执行匹配项的搜索。

  • RegExp.prototype.test()

    该正则在字符串里是否有匹配。

  • RegExp.prototype[@@match]()

    对给定字符串执行匹配并返回匹配结果。

  • RegExp.prototype[@@matchAll]()

    对给定字符串执行匹配,返回所有匹配结果。

  • RegExp.prototype[@@replace]()

    给定新的子串,替换所有匹配结果。

  • RegExp.prototype[@@search]()

    在给定字符串中搜索匹配项,并返回在字符串中找到字符索引。

  • RegExp.prototype[@@split]()

    通过将给定字符串拆分为子字符串,并返回字符串形成的数组。

  • RegExp.prototype.toString()

    返回表示指定对象的字符串。重写Object.prototype.toString()方法。

示例

使用正则改变数据结构

下例使用 Stringreplace() 方法去匹配姓名 first last 输出新的格式 last, first

在替换的文本中,脚本中使用 $1$2 指明括号里先前的匹配.

let re = /(\w+)\s(\w+)/;
let str = "John Smith";
let newstr = str.replace(re, "$2, $1");
console.log(newstr);

这将显示 “Smith, John”.

使用正则来划分带有多种行结束符和换行符的文本

对于不同的平台(Unix,Windows等等),其默认的行结束符是不一样的. 而下面的划分方式适用于所有平台。

let text = 'Some text\nAnd some more\r\nAnd yet\rThis is the end'
let lines = text.split(/\r\n|\r|\n/)
console.log(lines) // logs [ 'Some text', 'And some more', 'And yet', 'This is the end' ]

注意:在正则表达式中,以竖线分割的子模式的顺序会影响匹配结果。

在多行文本中使用正则表达式

let s = "Please yes\nmake my day!";s.match(/yes.*day/);
// Returns nulls.match(/yes[^]*day/);
// Returns 'yes\nmake my day'

使用带有 sticky 标志的正则表达式

带有sticky标志的正则表达式将会从源字符串的RegExp.prototype.lastIndex位置开始匹配,也就是进行“粘性匹配”。

let str = '#foo#'
let regex = /foo/yregex.lastIndex = 1
regex.test(str)      // true
regex.lastIndex = 5
regex.test(str)      // false (lastIndex is taken into account with sticky flag)
regex.lastIndex      // 0 (reset after match failure)

sticky 标志和 global 标志的不同点

如果正则表达式有粘性 y 标志,下一次匹配一定在 lastIndex 位置开始;如果正则表达式有全局 g 标志,下一次匹配可能在 lastIndex 位置开始,也可能在这个位置的后面开始。

re = /\d/y;
while (r = re.exec("123 456")) console.log(r, "AND re.lastIndex", re.lastIndex);// [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1
// [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2
// [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3
//   ... and no more match.

如果使用带有全局标志g的正则表达式re,就会捕获字符串中的所有6个数字,而非3个

使用正则表达式和 Unicode 字符

正如上面表格提到的,\w\W 只会匹配基本的 ASCII 字符;如 azAZ09_

为了匹配其他语言中的字符,如西里尔(Cyrillic)或 希伯来语(Hebrew),要使用 \uhhhhhhhh 表示以十六进制表示的字符的 Unicode 值。

下例展示了怎样从一个单词中分离出 Unicode 字符。

let text = "Образец text на русском языке";
let regex = /[\u0400-\u04FF]+/g;let match = regex.exec(text);
console.log(match[1]);  // prints "Образец"
console.log(regex.lastIndex);  // prints "7"let match2 = regex.exec(text);
console.log(match2[1]);  // prints "на" [did not print "text"]
console.log(regex.lastIndex);  // prints "15"// and so on

Unicode属性转义特性引入了一种解决方案,它允许使用像\p{scx=Cyrl}这样简单的语句。这里有一个外部资源,用来获取 Unicode 中的不同区块范围:Regexp-unicode-block

从 URL 中提取子域名

var url = "http://xxx.domain.com";
console.log(/[^.]+/.exec(url)[0].substr(7)); // logs "xxx"

使用浏览器内建的URL API而非正则表达式来解析URL是更好的做法

//get url
let addr = new URL("https://developer.mozilla.org/en-US/docs/Web/API/URL_API");
let host = addr.host;
let path = addr.pathname;

正则匹配符号大全

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,‘n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\’ 匹配 “” 而 “(” 则匹配 “(”。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,‘Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000” 中的 “Windows” ,但不能匹配 “Windows 3.1” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1” 中的 “Windows”,但不能匹配 “Windows 2000” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1’ 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

2、String 中的正则

1)match()

match()接受一个正则表达式作为参数。当正则表达式不具有全局属性 g ,该方法和 RegExpexec() 方法执行结果一样,如正则有全局标志 g 时,返回一个包含所有匹配项的纯数组。

格式:str.match(pattern)
功能:
  match 在功能上与正则对象自带的方法exec很类似。
  match根据匹配规则pattern匹配指定的字符串str,如果匹配成功则返回一个数组格式的结果用于存放匹配文本有关的信息,如果没有匹配到则返回null。

var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/i;var matches = text.match(pattern);
console.log(matches);// 0: "mom and dad and baby", 1: " and dad and baby", 2: " and baby", groups: undefined, index: 0, input: "mom and dad and baby", length: 3
console.log(pattern.lastIndex); // 20var pattern = /mom( and dad( and baby)?)?/gi;
matches = text.match(pattern);
console.log(matches);// ["mom and dad and baby"]
console.log(pattern.lastIndex); // 0text = "vat ,bat, sat, fat";
pattern = /.at/;//与 pattern.exec(text) 相同
matches = text.match(pattern);
console.log(matches);  //0: "vat", groups: undefined, index: 0, input: "vat ,vat, sat, fat", length: 1
console.log(pattern.lastIndex); //0//如果match的匹配规则具有全局g属性,那么match返回的匹配结果,便是一个包含所有匹配结果的纯数组
pattern = /.at/g;
matches = text.match(pattern);
console.log(matches);  //["vat", "bat", "sat", "fat"]
console.log(pattern.lastIndex); //0

2)search()

该方法接受一个正则表达式或者字符串作为参数,从字符串开头向后查找。

格式:str.search(pattern);

功能:根绝匹配规则pattern在字符串中检索指定的结果,如果检索到则返回该结果首字母在原字符中的索引,否则返回-1。其功能类似于indexOf,只是indexOf并不支持正则匹配。

该方法忽略全局修饰符g,也不支持lastIndex也就是意味着它不能被多次调用,一旦检索到结果,便会停止检索。

var text = "vat ,bat, sat, fat";
var pattern = /at/;var pos = text.search(pattern);
console.log(pos);  // 1
console.log( text.search("t") ); // 2

3)replace()

格式:str.replace(pattern,given)

功能:根据匹配规则pattern来用指定的内容given去替换str或其部分字符。其中pattern可以是str中的部分字符也可以是一个正则表达式。

pattern可以是字符串,也可以是正则表达式;given所代表替换的指定内容,既可以是字符串,也可以是一个回调函数。

replace()方法只会返回原字符被操作后的副本,并不会对原字符串进行改动。

如果 pattern是字符串,那么只会替换第一个匹配的子字符串。要想替换所有匹配的子串,需要 pattern 是正则表达式,且带全局标志 g。

var text = "cat ,bat, sat, fat";
var pattern = "at";var result = text.replace(pattern,"ond");
console.log(result);  // "cond ,bat, sat, fat"pattern = /at/g;
result = text.replace(pattern,"ond");
console.log(result); //"cond ,bond, sond, fond"var str = '世界上最遥远的距离 不是生与死的距离 而是我就站在你的面前 你却不知道我爱你。',st = ['死','爱','距离'],pattern = '',alt = '',str1= "";for(var i=0;i<st.length;i++){pattern = new RegExp(st[i],'g');for(var j=0;j<st[i].length;j++){alt+='*';}str1 = str.replace(pattern,alt);alt = '';
}console.log(str); //世界上最遥远的距离 不是生与死的距离 而是我就站在你的面前 你却不知道我爱你。
console.log(str1); //世界上最遥远的** 不是生与*的** 而是我就站在你的面前 你却不知道我*你。

given若是回调函数

在只有一个匹配项,即没有捕获组的情况下,

其格式为: function(match,index,input){}。

如果有多个捕获组,

其格式为: function(match,[$1…$9],index,input){}。

match: 表示当前匹配的结果
[$1 - $9]: 存在分组的情况下,表示当前 1 - 9 个分组的内容。
index: 当前匹配内容首字母在字符创中索引。
input :进行匹配的原字符创。

function htmlEscape(text){return text.replace(/[<>"&]/g,function(match,index,input){switch(match){case "<": return "&lt;";case ">": return "&gt;";case "&": return "&amp;";case "\"": return "&quot;";}});
}
console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>"));// &lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt;var str = '2016/10/29';
var pattern = /(\d+)(\/)/g;
var data = str.replace(pattern,function(result,$1,$2){return $1+'.';
});
console.log(data); //2016.10.29
console.log(str.replace(pattern,"$1.")); //2016.10.29
console.log(str.replace(/\//g,".")); //2016.10.29

4)split()

格式:str.split(pattern,length)
功能:
  根据规则 pattern 将字符串拆分为数组,拆分后的数组并不包含作为拆分依据的那个参数。
  默认情况下是空字符进行拆分,也就是每个任意的字符作为一个数组元素。
  pattern参数,可以是正则表达式,也可以是单纯的字符或字符串。
  length参数,用于设置拆分数组后数组最大的长度(即数组元素的个数)。缺省该项,表示将字符全部拆分为数组。

var str = 'hellow world!';
console.log(str.split('')); //  ["h", "e", "l", "l", "o", "w", " ", "w", "o", "r", "l", "d", "!"]
console.log(str.split('',5)); // ["h", "e", "l", "l", "o"]
console.log(str.split(/o/g)); //  ["hell", "w w", "rld!"]

ref

[MDN RegExp](RegExp(正则表达式) - JavaScript | MDN (mozilla.org))

[MDN URL Api](URL API - Web APIs | MDN (mozilla.org))

[js 中的正则表达式RegExp](js 中的正则表达式RegExp - zhanglw - 博客园 (cnblogs.com))

JavaScript知识之正则表达式(RegExp)相关推荐

  1. javascript类型系统——正则表达式RegExp类型

    原文:javascript类型系统--正则表达式RegExp类型 × 目录 [1]对象 [2]实例属性 [3]静态属性[4]实例方法 前面的话 前面已经介绍过javascript中正则表达式的基础语法 ...

  2. JavaScript中的正则表达式详解

    正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找.替换和提取操作. 正则表达式在人们的印象中可 ...

  3. 【思维导图】巩固你的JavaScript知识体系

    [思维导图]前端开发JavaScript-巩固你的JavaScript知识体系 版权声明:转载自CSDN博主「达达前端」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本 ...

  4. 52 JavaScript中的正则表达式

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.什么是正则表达式 正则表达是(regular expression)是用于匹配字符串中 ...

  5. 十、JavaScript中的正则表达式(六)

    @Author:Runsen @Date:2020/5/26 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排 ...

  6. JavaScript高级之正则表达式

    1. 正则表达式概述 1.1 什么是正则表达式 正则表达式( Regular Expression )是用于匹配字符串中字符组合的模式.在 JavaScript中,正则表达式也是对象. 正则表通常被用 ...

  7. JavaScript高级04 正则表达式

    1.正则表达式概述 1.1什么是正则表达式 正则表达式( Regular Expression )是用于匹配字符串中字符组合的模式.在JavaScript中,正则表达式也是对象. 正则表通常被用来检索 ...

  8. JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名

    JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名 安全域名列表 var DomainArray=['run ...

  9. javascript中的正则表达式语法

    正则表达式对象用来规范一个规范的表达式(也就是表达式符不符合特定的要求,比如是不是Email地址格式等),它具有用来检查给出的字符串是否符合规则的属性和方法.除此之外,你用RegExp构造器建立的个别 ...

最新文章

  1. Windows安装MongoDB
  2. day_02、基础数据类型
  3. CSocket类的Receive超时的问题解决方案
  4. 话里话外:从“种房子”谈流程与制度的差别
  5. Handler、Message的简单使用
  6. SQL Server LIKE语句使用举例
  7. SpringBoot整合themeleaf+bootstrap (五)
  8. 编写访问数据库的应用层程序,经常catch出的一些错误
  9. 个人风格就是一种品牌
  10. java lbp_OpenCV中基于LBP算法的人脸检测测试代码
  11. caffee2安装 踩坑记录
  12. 软件分享 | 第十二期 yoco文库下载
  13. u盘server2012服务器系统安装,如何安装原版Windows server 2012?U盘安装原版Windows server 2012方法...
  14. html5游戏 做广告联盟怎么样,几个比较好的国外广告联盟推荐
  15. 安装 ubuntu16.04 ROS2 超过5分钟你打我 后带 测试talker listener demo
  16. 使用opentelemetry-go操作Jaeger
  17. 股票分时成交明细接口的数据怎么看?
  18. [损失设计]2.Softmax Loss
  19. 多模态视觉任务Video Grounding介绍
  20. 2018东北四省赛 Store The Matrix (矩阵)

热门文章

  1. 贵大计算机专业高考分数线,2020贵州大学录取分数线一览表
  2. 如何在图片上添加水印?快把这些方法收好
  3. 知识型IP与网红的区别
  4. docker tomcat 的起动与访问
  5. 线上虚拟展馆增强观众沉浸式体验感
  6. 利用Minia软件对基因组测序二代数据的初步组装
  7. 智能优化算法之灰狼优化算法(GWO)的实现(Python附源码)
  8. 手机虚拟服务器app,手机远程控制服务器的app
  9. 关于Lisp的一己之见
  10. Redis key前缀的设计与使用