使用正則表達式查找方括號我有一位客戶想要提取規格限制的數字。 當文本使用括號時他可以做到這一點,但對於方括號則不行。由於方括號“[”和“]”是特殊的正則表達式字符,我認為使用轉義字符“\”或“\\”會有所幫助,但我無法讓它工作。
他正在搜索的文本可能類似於 [0.080, 1.20],他想使用正則表達式來獲取 0.080 和 1.2。
他目前在文本中查找左括號“(”的公式如下所示:
正則表達式( :文本, "((?<=\().+(?=\,))" )
對於右括號“)”,他使用
正則表達式( :文本, "((?<=\,).+(?=\)))" )
如何修改這些公式來查找“[”或“]”?
在他得到之後,他還希望能夠找到“<”、“">”、“+”、“-”和“+/-”。
任何幫助,將不勝感激。
謝謝!
回复:使用正則表達式查找方括號嗨查理,
你知道文本是什麼樣子嗎? 客戶甚至可能不需要正則表達式。 在這種情況下,生成的 JSL 通常更容易實現和維護。
例如:
Names Default To Here(1);
text = "this is a bunch of text with some data in it between brackets [2.3, 4.5] like so.";
specTxt = word(2, text, "[]");
specLo = num(word(1, specTxt, ","));
specHi = num(word(2, specTxt, ","));
show(specLo, specHi);
回复:使用正則表達式查找方括號這總是讓我困惑,因為 \[ 是劃分字符串的轉義序列。 如果你先轉義它,你可以用它來表示正則表達式元字符
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
對於第一個數字
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\2" ) )
對於第二個。
回复:使用正則表達式查找方括號但是,既然 16 磅的大錘能發出更大的聲響,為什麼還要使用釘錘呢?
回复:使用正則表達式查找方括號有! 如此真實。
回复:使用正則表達式查找方括號對於用戶來說,這是一個很好的問題,可以發佈到討論查看他們從更大的 JMP 用戶社區獲得的響應的速度和質量。
就我個人而言,我從未學習過正則表達式,所以我依靠字符函數對於大多數字符串操作。 特別是 Word() 函數對我來說非常有效。
如果您只學習一種公式編輯器函數,Word() 就是其中之一
回复:使用正則表達式查找方括號這是一個好主意。 我也很想知道人們多久會做我所做的事情,直接回答問題,而不是考慮用戶想要做什麼,從而提出一個簡單且更優雅的解決方案。 了解用戶需要什麼而不一定是他們想要什麼總是更好。
回复:使用正則表達式查找方括號這是如何使用正則表達式的另一個示例。
Names Default to Here( 1 );
// source
string = "My spec limits are [0.080,1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" ) );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
回复:使用正則表達式查找方括號謝謝布雷迪!我嘗試了你的解決方案並且有效。我喜歡簡單。有沒有辦法對“[”或“(”進行單詞搜索?我認為這更接近客戶所尋求的。
再次感謝!
查理
回复:使用正則表達式查找方括號謝謝唐!您的解決方案適用於方括號。有沒有辦法讓它搜索“(”或“[”,以便它適用於任何一種情況?
謝謝!
查理
回复:使用正則表達式查找方括號標記-
我在讓你的解決方案發揮作用時遇到了一些麻煩。我附上了一個示例數據表。你能看一下並讓我知道我做錯了什麼嗎?
謝謝,
查理
回复:使用正則表達式查找方括號謝謝杰夫。我根本不知道正則表達式,我也嘗試使用字符函數。但是,我想使用與客戶的做法非常相似的技術來回答客戶的問題,以便他可以輕鬆應用。
我確實鼓勵他將其發佈在社區上。我們會看看會發生什麼。
謝謝!
查理
回复:使用正則表達式查找方括號嗨查理,
word() 函數有 3 個參數,最後一個參數(分隔符集)是可選的。 這是一個帶引號的字符串,包含您要考慮的所有分隔符。 因此用戶可以將方括號和圓括號放入該字符串中。
要了解 word() 如何分解函數,可以幫助檢查words() 函數返回的內容。 Words() 返回定界後所有文本片段的列表。
例如:
word (2, “Hit the road jack”) 返回“the”。
word(2, "Hit the road jack", "") 返回“i”,因為當您想要將文本分解為單個字符時,會使用空字符串。
word(1, "abc/def[ghi]klm", "[]()") 返回 "abc/def"...如果你看 Words( "abc/def[ghi]klm", "[]()" ),你會得到
{ "abc/def", "ghi", "klm" } 作為結果。
希望這可以幫助。
乾杯,
布雷迪
回复:使用正則表達式查找方括號如果您確實想使用正則表達式,則可以使用以下字符串表示上限或下限
"[\!\[|\(]([0-9\.eE\+\-]+)\s*,\s*([0-9\.eE\+\-]+)"
唯一的區別是第二個參數,“\1”表示較低的參數,“\2”表示較高的參數。 要理解發生了什麼,請將表達式想像為四個部分
[\!\[|\(]
[a|b] 將匹配 a 或 b,方括號和圓括號都是特殊字符,因此必須使用反斜杠進行轉義。 因為序列 \[ 在 JSL 中也很特殊,所以需要 !表明它不是一個特殊的序列。
([0-9\.eE\+\-]+)
括號捕獲其中包含的表達式。 這就是 \1 所指的內容。 同樣,方括號用於指定字符集。 在本例中,它是數字、句號(轉義的特殊字符)、加號(同上)、減號(同上)、小寫或大寫 E 中的任何一個或多個(由於末尾有 +)。 如果我忘記了任何可以用來表示數字的字符,請將它們放在這裡。
\s*,\s*
零個或多個空格、逗號、零個或多個空格
([0-9\.eE\+\-]+)
表情與第一張捕獲的表情相同。 它是由\2 引用的。 最棒的是,一旦你走到這一步,你就可以停下來了。 無需捕獲右括號或括號(據我所知)。 如果你願意的話也可以。
綜上所述,我會使用布雷迪的解決方案。 它更簡潔,更容易理解。 您需要將逗號添加到分隔符集中,即
"[(,])"
回复:使用正則表達式查找方括號您之前的示例在逗號後不包含空格。 這是更正後的腳本示例:
Names Default to Here( 1 );
// source 1
string = "My spec limits are [0.080, 1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
// source 2
string = "My spec limits are (0.080, 1.20) for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
我附上了您的數據表和更正後的公式。
回复:使用正則表達式查找方括號這是一個很好的例子,說明如果沒有很好地理解底層數據,正則表達式的實現可能會很棘手。 空間的存在/不存在會產生影響。
現在假設必須支持任何合法的數字格式。 在這種情況下,正則表達式會變得更難看,因為您必須考慮科學計數法、負數、句點(或不)等。
在這種情況下,JSL 函數和 Regex 的組合可能比單獨使用任何一個函數更容易完成工作。
例如,在下面的 JSL 中:
1) Replace 將括號和括號更改為大括號(列表運算符...在第 3 點中很重要)
2) 正則表達式抓取大括號及其包含的內容,假設是一對任何格式的合法數字
3) Parse 將Regex 返回的字符串轉換為JSL 表達式,將列表內容分配給specLo 和specHi。
txt = "My spec limits are [-4.087e-3, 1.20] for this CQA.";
{specLo, specHi} = Parse( Regex( Substitute( txt, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
-布雷迪
回复:使用正則表達式查找方括號感謝您的幫助!