使用正则表达式查找方括号我有一位客户想要提取规格限制的数字。 当文本使用括号时他可以做到这一点,但对于方括号则不行。由于方括号“[”和“]”是特殊的正则表达式字符,我认为使用转义字符“\”或“\\”会有所帮助,但我无法让它工作。
他正在搜索的文本可能类似于 [0.080, 1.20],他想使用正则表达式来获取 0.080 和 1.2。
他目前在文本中查找左括号“(”的公式如下所示:
正则表达式( :文本, "((?<=\().+(?=\,))" )
对于右括号“)”,他使用
正则表达式( :文本, "((?<=\,).+(?=\)))" )
如何修改这些公式来查找“[”或“]”?
在他得到之后,他还希望能够找到“<”、“">”、“+”、“-”和“+/-”。
任何帮助,将不胜感激。
谢谢!
回复:使用正则表达式查找方括号这总是让我困惑,因为 \[ 是划分字符串的转义序列。 如果你先转义它,你可以用它来表示正则表达式元字符
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
对于第一个数字
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\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);
回复:使用正则表达式查找方括号但是,当 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, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
-布雷迪
回复:使用正则表达式查找方括号感谢您的帮助!