Regex 正则表达式:返回不超过两个特定字符的字符串
我有数百个包含数字数组的文件。阵列大小不同。我需要确定哪些数组只有三个元素,并提取它们的值 以下是一些例子:Regex 正则表达式:返回不超过两个特定字符的字符串,regex,Regex,我有数百个包含数字数组的文件。阵列大小不同。我需要确定哪些数组只有三个元素,并提取它们的值 以下是一些例子: askjdh fdshajkjashf hjd ([123, 2321, 321, 123, 3425.98]); askjdh ljkjsd hjd ([123, 2321, 321.345]); askjdh w;klejfjk hjd ([123, 2321, 321.345]); % aksdhj askjdh ljkjsd hjd ([ 13, 21 , -4
askjdh fdshajkjashf hjd ([123, 2321, 321, 123, 3425.98]);
askjdh ljkjsd hjd ([123, 2321, 321.345]);
askjdh w;klejfjk hjd ([123, 2321, 321.345]); % aksdhj
askjdh ljkjsd hjd ([ 13, 21 , -45]);
上面的两个匹配项应为:
askjdh ljkjsd hjd ([123, 2321, 321.345]);
askjdh ljkjsd hjd ([ 13, 21 , -45]);
其值为:
123, 2321, 321.345
13, 21, -45
我原以为这样行得通,但事实并非如此:
\[(.*),(.*),(^[^,].*$)\]
这确实有效。。。但它看起来相当笨重。也许还有更优雅的
\[\s*([-+]?\d+\.?\d*)\s*,\s*([-+]?\d+\.?\d*)\s*,\s*([-+]?\d+\.?\d*)\s*\]
您可以使用这样的正则表达式:
\[\s*(?:-?\d*\.?\d+\s*,\s*){2}-?\d*\.?\d+\]
它与您的正则表达式类似,但使用
{2}
符号可以将其缩短一点。因为您要查找的正是三个元素,所以可以使用/\[^,]+,*[^,]+,*[^\]+*\]/
\[[^,]+, *[^,]+, *[^\]]+ *\]
以下是我尝试做的事情:
\[
\s*
(?:
\s*
(\d+(?:\.\d+)?)
\s*\,\s*
)+
(?: # this is supposed to match the last number, which is not followed by a ","
\s*
(\-?\d+(?:\.\d+)?)
\s*
)?
\]
但出于某种原因,我只得到最后两个数字(查看右侧的“匹配信息”),而不是所有数字。使用此模式w/
gm
选项仅提取3个元素及其值
\(\[\s*([^, ]+)\s*,\s*([^, ]+)\s*,\s*([^, ]+)\s*\]\);$
您使用哪种语言?在java中,获取数组的长度是“array.length”,然后获取其值是“array[0];数组[1]等。这就是你想要的吗?语言:我正在使用BareGrep搜索所有文件。你能发布到regex101的链接吗?我试过像你一样的东西,但我认为OP想要得到数字(这让我使用了在你的答案中看不到的大括号)。编辑:是的,我看到了链接,谢谢:)@Al.G。好了:)嘿,托比,你甚至可以用:
/\[(*[^,]+,){2}*[^\]+*\]/
来缩短它。它还有一个额外的优点,就是可以捕获exp编号,比如10.02e-23。我最后去掉了结尾的“$”,因为我确实需要数组定义后面有文本的情况。最后我使用了:[\s*([^,]+)\s*,\s*([^,]+)\s*,\s*([^,]+)\s*]