私は基本的に次のような文字列を解析したい:
"#FFFFFF" to "#FFFFFF",
"##FFFFFF" to "#FFFFFF",
"FFFFFF" to "#FFFFFF"
このようなケースを処理する一般的な正規表現を作成する際に問題が発生しています。どんな助けでも大歓迎です。
私は基本的に次のような文字列を解析したい:
"#FFFFFF" to "#FFFFFF",
"##FFFFFF" to "#FFFFFF",
"FFFFFF" to "#FFFFFF"
このようなケースを処理する一般的な正規表現を作成する際に問題が発生しています。どんな助けでも大歓迎です。
var str = '###FFFF';
str = str.replace (/^#*/, '#')
文字列の先頭にある 0 回以上の # を 1 つの # に置き換えます。
あなたは次のようなものが欲しい/^[#][^#]*$/
function formatThing(string){
return "#" + string.replace(/#/g,"");
}
すべての「#」を何も置き換えずに、先頭に「#」を付けます。私の意見では、これは複雑な正規表現よりも読みやすいです。提供された 3 つの入力すべて、およびその他のいくつかの奇妙なケースで機能します。
注意してください、これはあなたの質問があなたが望んでいたように変換するためのものであり、マッチングではありません。質問に書いたXからYへの意味で、さまざまな入力を正規化しようとしている場合に適しています。"##FFFFFF"を使用して最初の "#" 以外のすべてに一致させるか、先頭の "#" がないために "FFFFFF" との一致を拒否しても、すぐには十分ではありません。
任意の数の # OR の後に任意の数を一致させたいと思うでしょう。そのように(jsFiddleを参照):
new RegExp("(^#+|^)");
// #Test -> #Test
// ####Test -> #Test
// Test -> #Test
#
最初の文字のいずれか (またはなし) を次の単一のインスタンスに置き換え#
ます。
resultString = sourceString.replace(/^#*/, "#");
var string = "#fffff";
string = string.replace(/#*/g, function(m, i){ return !i?"#":"";});
先頭の # の有無にかかわらず、3 ~ 6 文字の 16 進コードをチェックするミックスに追加する別のソリューション。
var re = /#?([A-F0-9]{3,6})/i;
function getHex (str){
var val = str.match(re)
return val ? "#" + val[1] : null;
}
console.log( getHex( "#FFFFFF" ) );
console.log( getHex( "##FFFFFF" ) );
console.log( getHex( "FFFFFF" ) );
これは、文字列が実際に有効な色であることを検証しませんが、文字列の最初の文字としてハッシュが 1 つだけあることを強制するだけです (文字列の場所に関係なく、すべてのハッシュを文字列から取り除き、先頭に 1 つ追加することにより):
var colorString = "##ffffff";
console.log("#" + colorString.replace(/#/g, "")); // prints #ffffff