javascriptタイプシステムの正規表現
25682 ワード
目次[1]定義[2]特性[3]書き方[4]構文[5]構文属性[6]インスタンス属性[7]継承の方法[8]例示方法[9]モードマッチング方法[10]制約[11]一般例
定義
正則は規則またはモードと呼ばれ、強力な文字列マッチングツールです.javascriptはRegExpタイプで正規表現をサポートします.
特性
[1]欲張りで、最も長いものにマッチする
[2]怠け者で、設定しない/gであれば、第1個だけマッチする
書き方
perl表記(字面量形式を使う)
[1]g:グローバルモード(global)を表します.
[2]i:大文字と小文字を区別しないことを表す(イグノレケース)
[3]m:マルチラインモードを表します.
RegExpコンストラクタは、2つのパラメータを受信します.マッチする文字列パターンとフラグ文字列(flags)(オプション)
[注意]RegExpコンストラクタの二つのパラメータは文字列です.また、文字列の量で定義された任意の表現は、コンストラクタを使用することができます.
文字数の書き方は変数をサポートしていません.構造関数としてのみ書きます.
[tips]class元素を取得します.
構文
[注意]正規表現では、スペースを残してはいけません.
元文字(14個)
変換記号
[tips]重複する項目の一番多い文字と個数を探してください.
alert()とconsolie.log()の中の文字はシステム変換文字です.
ではなく、使うべきです.
RegExpコンストラクタのパラメータは文字列であるため、文字を二重変換する必要がある場合があります.すべての元の文字は二重に変換しなければなりません.変換された文字も二重に変換しなければなりません.
コンストラクタのプロパティ
作用領域に適用されるすべての正規表現は、実行される最近の正規表現動作に基づいて変化します.これらの属性の特徴は、長い属性名と短い属性名の2つの方法でアクセスできることである.短い属性名はほとんど有効なECMAScript識別子ではないので、括弧文法でアクセスしなければなりません.
インスタンスのプロパティ
実例的な属性を通して、正規表現の各態様情報を知ることができますが、これらの情報はすべてモード宣言に含まれています.
継承の方法
全部でtoStering()、toLocal Stering()とvalueOf()の3つの方法を返し、正則表現の字面量を返します.正則表現を作成する方式とは関係がありません.なお、toString()とtoLocalle String()が返した正規表現の文字列表現であり、valueOfが返したのは正規表現オブジェクト自体である.
実例的な方法
exec()
キャプチャグループのために特別に設計され、モードを適用する文字列としてパラメータを受け付けます.次に、最初のマッチ情報を含む配列を返します.マッチするものがない場合はnullを返します.返した配列は、2つの追加的な属性:indexとinputを含んでいます.indexは文字列の位置にマッチする項目を表し、inputは正規表現を適用する文字列を表します.配列において、最初の項目はモード全体にマッチする文字列であり、他の項目はモード中のキャプチャグループにマッチする文字列であり、モード中にグループがキャプチャされていない場合、配列は一つだけ含まれる.
文字列パラメータを受け取り、モードがパラメータと一致する場合はtrueを返します.そうでなければfalseを返します.
[注意]ターゲット文字列とモードが一致するかどうかだけを知りたいが、テキストの内容を知る必要がない場合は、if文でよく使われます.
パターンマッチング方法
Stringタイプは、文字列におけるマッチングモードに関するいくつかの方法を定義している.
match()
一つのパラメータ、正規または文字列だけを受け入れて、マッチした内容を一つの配列に保存して返します.
[注意]グローバルマークを加えると、match()メソッドの戻り値にindexとinput属性がありません.
[1]を入れない/g
一つのパラメータしか受け付けません.正則または文字列で、マッチした内容を返します.文字列に最初に現れた位置は、開始位置を設定できないindexOfと似ています.戻り値が見つからない-1
[1]正則(プラス/gとプラス/gの効果は同じです.)
この方法は2つのパラメータを受信します.1番目は正規表現または文字列(検索対象の内容)、2番目は文字列または関数(置換内容)です.
[1]文字列の置換
マッチするもののみ(モードにマッチした文字列の場合、3つのパラメータがこの関数に伝達されます.モードのマッチング項目、モードマッチング項目は文字列の位置、元の文字列です.正規表現で複数のキャプチャグループが定義されている場合、関数に伝達されるパラメータは順次モードのマッチング項目、第1のキャプチャグループのマッチング項目、第2のキャプチャグループのマッチング項目となります.N番目のグループのマッチを取得しましたが、最後の2つのパラメータは、文字列の位置と元の文字列にそれぞれマッチしています.この関数は文字列を返します.
この方法は、指定されたセパレータに基づいて、1つの文字列を複数の文字列に分割し、結果を1つの配列に置くことができ、セパレータは文字列でもよいし、RegExpでもよい.この方法は、第2のパラメータ(オプション)を受け入れることができる.配列のサイズを指定します.2番目のパラメータが0-array.length範囲の値の場合は指定されたパラメータで出力します.他の場合はすべての結果を出力します.
[注意]IE 8-ペアスプリット()の正規表現は、キャプチャグループを無視します.
[tips]split(')であれば、元の配列は1文字の文字を分割して伝えられます.
限界性
以下はECMAScript正規表現でサポートされていない特性です.
[1]文字列の先頭の\Aと\Zアンカーにマッチします.しかし、文字列の開始と終了をサポートします.
[2]後方検索(前への検索には対応)
[3]集合と交差類
[4]原子グループ
[5]ユニックサポート(1文字を除く)
[6]命名されたグループ(ただし、番号付けされたグループに対応)
[7]s(singleシングル)とx(free-spacing無間隔)のマッチングモード
[8]条件マッチング
[9]正規表現のコメント
よくある実例
[1]2つの方法で文字列のすべての数字を探し出す.
[a]従来の文字列で操作する
定義
正則は規則またはモードと呼ばれ、強力な文字列マッチングツールです.javascriptはRegExpタイプで正規表現をサポートします.
特性
[1]欲張りで、最も長いものにマッチする
[2]怠け者で、設定しない/gであれば、第1個だけマッチする
書き方
perl表記(字面量形式を使う)
var expression = /pattern/flags;
パターン部分は、任意の単純または複雑な正規表現であってもよく、文字列、限定クラス、グループ、前向き検索、逆参照を含んでも良い.各正規表現は、正規表現の挙動を示すために、一つ以上のフラグを付けることができます.正規表現は三つのフラグをサポートします.[1]g:グローバルモード(global)を表します.
[2]i:大文字と小文字を区別しないことを表す(イグノレケース)
[3]m:マルチラインモードを表します.
// 'at'
var pattern1 = /at/g;
RegExpコンストラクタRegExpコンストラクタは、2つのパラメータを受信します.マッチする文字列パターンとフラグ文字列(flags)(オプション)
[注意]RegExpコンストラクタの二つのパラメータは文字列です.また、文字列の量で定義された任意の表現は、コンストラクタを使用することができます.
// 'at'
var pattern = new RegExp('at','g');
二つの書き方の違い文字数の書き方は変数をサポートしていません.構造関数としてのみ書きます.
[tips]class元素を取得します.
function getByClass(obj,classname){
var elements = obj.getElementsByTagName('*');
var result = [];
var pattern = new RegExp( '(^|\\s)'+ classname + '(\\s|$)');
for(var i = 0; i < elements.length; i++){
if(pattern.test(elements[i].className)){
result.push(elements[i]);
}
}
return result;
}
[注意]ES 3では、正規表現の字面量は常に同じRegExp例を共有していますが、構造関数を用いて作成された新しいRegExpの各例は新しい例です.ES 5で正則を使用すると規定されている字面量は、RegExpコンストラクターを直接呼び出すように、毎回新しいRegExp例を作成しなければならない.構文
[注意]正規表現では、スペースを残してはいけません.
元文字(14個)
() [] {} \ ^ $ | ? * + .
[注意]元の文字は必ず意味を変えます.すなわち、「変換文字を加えて、new RegExpで書く正則は二重に変換しなければなりません.」変換記号
.
\d
\D
\w 、 、
\W 、 、 ( \w)
\s
\S
\b (\w \w, )
\B
\1
\t
\v
\uxxxx xxxx Unicode (\u4e00-\u9fa5 )
(\w)(\d)\1\2 :\1 \w ,\2 \d
[注意]正則表現のサブ項目は、必ず小さい括弧で囲まれ、順番は小さい括弧の前の括弧で表示される順番に準じます.[tips]重複する項目の一番多い文字と個数を探してください.
var str = 'aaaaabbbbbdddddaaaaaaaffffffffffffffffffgggggcccccce';
var pattern = /(\w)\1+/g;
var maxLength = 0;
var maxValue = '';
var result = str.replace(pattern,function(match,match1,pos,originalText){
if(match.length > maxLength){
maxLength = match.length;
maxValue = match1;
}
})
console.log(maxLength,maxValue);//18 "f"
システム変換alert()とconsolie.log()の中の文字はシステム変換文字です.
\0
\t
\b
\r
\f
\\
\'
\"
\xnn nn (n 0-f), \x41 'A'
\unnnn nnnn Unicode (n 0-f), \u03a3 ε
[注意]alertの中の改行はではなく、使うべきです.
alert('http://www.baidu.com
\t ')
二重転義RegExpコンストラクタのパラメータは文字列であるため、文字を二重変換する必要がある場合があります.すべての元の文字は二重に変換しなければなりません.変換された文字も二重に変換しなければなりません.
->
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
/name\/age/ "name\\/age"
/\d.\d{1,2}/ "\\d.\\d{1,2}"
/\w\\hello\\123/ "\\w\\\\hello\\\\123"
助数詞{n} n
{n,m} n , m
{n,} n
? {0,1}
* {0,}
+ {1,}
位置記号^
$
?=
?!
制御記号[]
|
^
-
(red|blue|green)
[abc]
[^abc]
[0-9] 0 9
[a-z] a z
[A-Z] A Z
[A-z] A z
[adgk]
[^adgk]
ドル記号$$ $
$& ( RegExp.lastMatch )
$` ( RegExp.leftContext )
$' ( RegExp.rightContext )
$n n , n 0-9。$1 ( 1 )
$nn nn , nn 01-99
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$0'))//$0,$0,$0,$0
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$1'))//ca,ba,sa,fa
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$2'))//t,t,t,t
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$3'))//$3,$3,$3,$3
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$$'))//$,$,$,$
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$&'))//cat,bat,sat,fat
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,'$`'))//,cat,,cat,bat,,cat,bat,sat,
console.log('cat,bat,sat,fat'.replace(/(.a)(t)/g,"$'"))//,bat,sat,fat,,sat,fat,,fat,
コンストラクタのプロパティ
作用領域に適用されるすべての正規表現は、実行される最近の正規表現動作に基づいて変化します.これらの属性の特徴は、長い属性名と短い属性名の2つの方法でアクセスできることである.短い属性名はほとんど有効なECMAScript識別子ではないので、括弧文法でアクセスしなければなりません.
input $_
lastMatch $&
lastParen $+
leftContext $` input lastMatch
multiline $* ,
rightContext $' Input lastMarch
これらの属性を使用して、exc()方法またはtext()方法で実行される操作からより具体的な情報を抽出することができる.var text = 'this has been a short summer';
var pattern = /(.)hort/g;
if(pattern.test(text)){
console.log(RegExp.input);//'this has been a short summer'
console.log(RegExp.leftContext);//'this has been a '
console.log(RegExp.rightContext);//' summer'
console.log(RegExp.lastMatch);//'short'
console.log(RegExp.lastParen);//'s'
console.log(RegExp.multiline);//false
console.log(RegExp['$_']);//'this has been a short summer'
console.log(RegExp['$`']);//'this has been a '
console.log(RegExp["$'"]);//' summer'
console.log(RegExp['$&']);//'short'
console.log(RegExp['$+']);//'s'
console.log(RegExp['$*']);//false
}
//javascript 9 。RegExp.$1\RegExp.$2\RegExp.$3…… RegExp.$9 、 …… 。 exec() test() ,
var text = 'this has been a short summer';
var pattern = /(..)or(.)/g;
if(pattern.test(text)){
console.log(RegExp.$1);//sh
console.log(RegExp.$2);//t
}
インスタンスのプロパティ
実例的な属性を通して、正規表現の各態様情報を知ることができますが、これらの情報はすべてモード宣言に含まれています.
global: , g
ignoreCase: , i
lastIndex: , , 0
multiline: , m
source: ,
var pattern = new RegExp('\\[bc\\]at','i');
console.log(pattern.global);//false
console.log(pattern.ignoreCase);//true
console.log(pattern.multiline);//false
console.log(pattern.lastIndex);//0
console.log(pattern.source);//'\[bc\]at'
継承の方法
全部でtoStering()、toLocal Stering()とvalueOf()の3つの方法を返し、正則表現の字面量を返します.正則表現を作成する方式とは関係がありません.なお、toString()とtoLocalle String()が返した正規表現の文字列表現であり、valueOfが返したのは正規表現オブジェクト自体である.
var pattern = new RegExp('\\[bc\\]at','gi');
console.log(pattern.toString()); // '/\[bc\]at/gi'
console.log(pattern.toLocaleString()); // '/\[bc\]at/gi'
console.log(pattern.valueOf()); // /\[bc\]at/gi
実例的な方法
exec()
キャプチャグループのために特別に設計され、モードを適用する文字列としてパラメータを受け付けます.次に、最初のマッチ情報を含む配列を返します.マッチするものがない場合はnullを返します.返した配列は、2つの追加的な属性:indexとinputを含んでいます.indexは文字列の位置にマッチする項目を表し、inputは正規表現を適用する文字列を表します.配列において、最初の項目はモード全体にマッチする文字列であり、他の項目はモード中のキャプチャグループにマッチする文字列であり、モード中にグループがキャプチャされていない場合、配列は一つだけ含まれる.
var text = 'mom and dad and baby and others';
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(pattern,matches);
//pattern.lastIndex:20
//matches[0]:'mom and dad and baby'
//matches[1]:' and dad and baby'
//matches[2]:' and baby'
//matches.index:0
//matches.input:'mom and dad and baby and others'
[注意]exec()方法では、モードにグローバルフラグ(g)が設定されていても、その都度、マッチするエントリのみが返されます.グローバルフラグが設定されていない場合、同じ文字列で何度もexec()を呼び出し、常に最初のマッチ項目の情報を返します.グローバルフラグを設定する場合は、exec()を呼び出すたびに文字列の中で新しいマッチを探し続けます.IE 8-lastIndex属性にばらつきがあり、非グローバルモードでもlastIndex属性は毎回変化します.var text = 'cat,bat,sat,fat';
var pattern1 = /.at/;
var matches = pattern1.exec(text);
console.log(pattern1,matches);
//pattern1.lastIndex:0
//matches[0]:'cat'
//matches.index:0
//matches.input:'cat,bat,sat,fat'
var text = 'cat,bat,sat,fat';
matches = pattern1.exec(text);
console.log(pattern1,matches);
//pattern1.lastIndex:0
//matches[0]:'cat'
//matches.index:0
//matches.input:'cat,bat,sat,fat'
var text = 'cat,bat,sat,fat';
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
console.log(pattern2,matches);
//pattern2.lastIndex:3
//matches[0]:'cat'
//matches.index:0
//matches.input:'cat,bat,sat,fat'
var text = 'cat,bat,sat,fat';
matches = pattern2.exec(text);
console.log(pattern2,matches);
//pattern2.lastIndex:7
//matches[0]:'bat'
//matches.index:4
//matches.input:'cat,bat,sat,fat'
[tips]exec()の方法で一致するすべての位置とすべての値を見つけます.var string = 'j1h342jg24g234j 3g24j1';
var pattern = /\d/g;
var valueArray = [];//
var indexArray = [];//
var temp = pattern.exec(string);
while(temp != null){
valueArray.push(temp[0]);
indexArray.push(temp.index);
temp = pattern.exec(string);
}
//["1", "3", "4", "2", "2", "4", "2", "3", "4", "3", "2", "4", "1"] [1, 3, 4, 5, 8, 9, 11, 12, 13, 16, 18, 19, 21]
console.log(valueArray,indexArray);
test()文字列パラメータを受け取り、モードがパラメータと一致する場合はtrueを返します.そうでなければfalseを返します.
[注意]ターゲット文字列とモードが一致するかどうかだけを知りたいが、テキストの内容を知る必要がない場合は、if文でよく使われます.
var text = '000-00-000';
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
console.log('The pattern was matched');
}
パターンマッチング方法
Stringタイプは、文字列におけるマッチングモードに関するいくつかの方法を定義している.
match()
一つのパラメータ、正規または文字列だけを受け入れて、マッチした内容を一つの配列に保存して返します.
[注意]グローバルマークを加えると、match()メソッドの戻り値にindexとinput属性がありません.
[1]を入れない/g
var string = 'cat,bat,sat,fat';
var pattern = /.at/;
var matches = string.match(pattern);
console.log(matches,matches.index,matches.input);//['cat'] 0 'cat,bat,sat,fat'
[2]プラス/gvar string = 'cat,bat,sat,fat';
var pattern = /.at/g;
var matches = string.match(pattern);
console.log(matches,matches.index,matches.input);//['cat','bat','sat','fat'] undefined undefined
[3]文字列var string = 'cat,bat,sat,fat';
var pattern = 'at';
var matches = string.match(pattern);
console.log(matches,matches.index,matches.input);//['at'] 1 'cat,bat,sat,fat'
search()一つのパラメータしか受け付けません.正則または文字列で、マッチした内容を返します.文字列に最初に現れた位置は、開始位置を設定できないindexOfと似ています.戻り値が見つからない-1
[1]正則(プラス/gとプラス/gの効果は同じです.)
var string = 'cat,bat,sat,fat';
var pattern = /.at/;
var pos = string.search(pattern);
console.log(pos);//0
[2]文字列var string = 'cat,bat,sat,fat';
var pattern = 'at';
var pos = string.search(pattern);
console.log(pos);//1
[tips]マッチングのすべての位置を見つけるfunction fnAllSearch(str,pattern){
var pos = str.search(pattern);
var length = str.match(pattern)[0].length;
var index = pos+length;
var result = [];
var last = index;
result.push(pos);
while(true){
str = str.substr(index);
pos = str.search(pattern);
if(pos === -1){
break;
}
length = str.match(pattern)[0].length;
index = pos+length;
result.push(last+pos);
last += index;
}
return result;
}
console.log(fnAllSearch('cat23fbat246565sa3dftf44at',/\d+/));//[3,9,17,22]
replace()この方法は2つのパラメータを受信します.1番目は正規表現または文字列(検索対象の内容)、2番目は文字列または関数(置換内容)です.
[1]文字列の置換
var string = 'cat,bat,sat,fat';
var result = string.replace('at','ond');
console.log(result);//'cond,bat,sat,fat'
[2]正則無/g置換var string = 'cat,bat,sat,fat';
var result = string.replace(/at/,'ond');
console.log(result);//'cond,bat,sat,fat'
[3]正則には/g置換があるvar string = 'cat,bat,sat,fat';
var result = string.replace(/at/g,'ond');
console.log(result);//'cond,bond,sond,fond'
[4]関数置換マッチするもののみ(モードにマッチした文字列の場合、3つのパラメータがこの関数に伝達されます.モードのマッチング項目、モードマッチング項目は文字列の位置、元の文字列です.正規表現で複数のキャプチャグループが定義されている場合、関数に伝達されるパラメータは順次モードのマッチング項目、第1のキャプチャグループのマッチング項目、第2のキャプチャグループのマッチング項目となります.N番目のグループのマッチを取得しましたが、最後の2つのパラメータは、文字列の位置と元の文字列にそれぞれマッチしています.この関数は文字列を返します.
var string = 'cat,bat,sat,fat';
var index = 0;
var result = string.replace(/at/g,function(match,pos,originalText){
index++;
if( index== 2){
return 'wow';
}else{
return '0';
}
});
console.log(result);//'c0,bwow,s0,f0'
[tips]サイドスクリプトによるxss攻撃を防止する(css)function htmlEscape(text){
return text.replace(/[<>"&]/g,function(match,pos,originalText){
switch(match){
case '<':
return '<';
case '>':
return '>';
case '&':
return '&';
case '\"':
return '"';
}
});
}
console.log(htmlEscape('<p class=\"greeting\">Hello world!</p>'));
//<p class=" greeting">Hello world!</p>
console.log(htmlEscape('<p class="greeting">Hello world!</p>'));
//
スプリット()この方法は、指定されたセパレータに基づいて、1つの文字列を複数の文字列に分割し、結果を1つの配列に置くことができ、セパレータは文字列でもよいし、RegExpでもよい.この方法は、第2のパラメータ(オプション)を受け入れることができる.配列のサイズを指定します.2番目のパラメータが0-array.length範囲の値の場合は指定されたパラメータで出力します.他の場合はすべての結果を出力します.
[注意]IE 8-ペアスプリット()の正規表現は、キャプチャグループを無視します.
[tips]split(')であれば、元の配列は1文字の文字を分割して伝えられます.
var colorText = 'red,blue,green,yellow';
console.log(colorText.split(''));//["r", "e", "d", ",", "b", "l", "u", "e", ",", "g", "r", "e", "e", "n", ",", "y", "e", "l", "l", "o", "w"]
console.log(colorText.split(','));//["red", "blue", "green", "yellow"]
console.log(colorText.split(',',2));//["red", "blue"]
console.log(colorText.split(/\,/));//["red", "blue", "green", "yellow"]
console.log(colorText.split(/e/));//["r", "d,blu", ",gr", "", "n,y", "llow"]
console.log(colorText.split(/[^\,]+/));// ["", ",", ",", ",", ""],IE8- [",",",",","]
限界性
以下はECMAScript正規表現でサポートされていない特性です.
[1]文字列の先頭の\Aと\Zアンカーにマッチします.しかし、文字列の開始と終了をサポートします.
[2]後方検索(前への検索には対応)
[3]集合と交差類
[4]原子グループ
[5]ユニックサポート(1文字を除く)
[6]命名されたグループ(ただし、番号付けされたグループに対応)
[7]s(singleシングル)とx(free-spacing無間隔)のマッチングモード
[8]条件マッチング
[9]正規表現のコメント
よくある実例
[1]2つの方法で文字列のすべての数字を探し出す.
[a]従来の文字列で操作する
var str1 = 'j1h342jg24g234j 3g24j1';
var array = [];
var temp = '';
for(var i = 0; i < str1.length; i++){
var value = parseInt(str1.charAt(i));// Number()
if(!isNaN(value)){
temp += str1.charAt(i);
}else{
if(temp != ''){
array.push(temp);
temp = '';
}
}
}
if(temp != ''){
array.push(temp);
temp = '';
}
console.log(array);//["1", "342", "24", "234", "3", "24", "1"]
[b]正規表現を使うvar str1 = 'j1h342jg24g234j 3g24j1';
array = str1.match(/\d+/g);
console.log(array);//["1", "342", "24", "234", "3", "24", "1"]
[2]敏感語フィルタリング(replace方法の関数マッチング)var string = 'FLG ';
var pattern = /FLG| /g;
var result = string.replace(pattern,function($0){
var s = '';
for(var i = 0; i < $0.length; i++){
s+= '*';
}
return s;
})
console.log(result);//*** **
[3]日付フォーマットvar array = ['2015.7.28','2015-7-28','2015/7/28','2015.7-28','2015-7.28','2015/7---28'];
function formatDate(date){
return date.replace(/(\d+)\D+(\d+)\D+(\d+)/,'$1'+' '+'$2'+' '+'$3'+' ')
}
var result = [];
for(var i = 0 ; i < array.length; i++){
result.push(formatDate(array[i]));
}
console.log(result);//["2015 7 28 ", "2015 7 28 ", "2015 7 28 ", "2015 7 28 ", "2015 7 28 ", "2015 7 28 "]
[4]ウェブページのテキストの内容を取得するvar str = '<p>refds</p><p>fasdf</p>'
var pattern = /<[^<>]+>/g;
console.log(str.replace(pattern,''));//refdsfasdf
[5]末尾のスペースを取り除くtrim()互換の書き方var string = ' my name is littlematch ';
console.log(string.replace(/^\s+|\s+$/,''));//my name is littlematch