Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式以查找两个字符之间包含的字符串,同时排除分隔符_Regex - Fatal编程技术网

Regex 正则表达式以查找两个字符之间包含的字符串,同时排除分隔符

Regex 正则表达式以查找两个字符之间包含的字符串,同时排除分隔符,regex,Regex,我需要从字符串中提取包含在两个分隔符之间的一组字符,而不返回分隔符本身 一个简单的例子应该很有帮助: Target:提取方括号之间的子字符串,而不返回括号本身 基本字符串:这是一个测试字符串[或多或少] 如果我使用以下注册表。前 \[.*?\] \[.*?\] 匹配项是[或多或少]。我只需要获得或多或少的(不带括号) 有可能做到吗?容易做到: (?<=\[)(.*?)(?=\]) 然后返回第一个捕获的组,而不是整个匹配。您只需要“捕获”括号之间的位 \[(.*?)\] 要捕获,请将其放

我需要从字符串中提取包含在两个分隔符之间的一组字符,而不返回分隔符本身

一个简单的例子应该很有帮助:

Target:提取方括号之间的子字符串,而不返回括号本身

基本字符串
这是一个测试字符串[或多或少]

如果我使用以下注册表。前

\[.*?\] \[.*?\] 匹配项是
[或多或少]
。我只需要获得或多或少的
(不带括号)

有可能做到吗?

容易做到:

(?<=\[)(.*?)(?=\])

然后返回第一个捕获的组,而不是整个匹配。

您只需要“捕获”括号之间的位

\[(.*?)\]
要捕获,请将其放在括号内。您不能说这是使用哪种语言。例如,在Perl中,您可以使用$1变量访问它

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";
其他语言将有不同的机制。例如,我相信C#使用类。

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);

要同时删除[],请使用:

\[.+\]

如果需要提取不带括号的文本,可以使用bash awk

echo“[hola mundo]”|awk-F'[]]“{print$2}”

结果:


hola mundo

我在使用带有bash脚本的正则表达式时遇到了同样的问题。 我使用了一个两步解决方案,使用带有grep-o应用的管道

 '\[(.*?)\]'  
首先,然后

'\b.*\b'

显然,在其他答案上效率不高,但这是另一种选择

如果您使用的是JavaScript,则由cletus提供的
(?此工具专门用于JavaScript的正则表达式解析器
/[^[\]+(?=])/g

只需在控制台中运行这个

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

[^\[]
匹配任何不是[]的字符

+
匹配一个或多个非
[
的项。创建这些匹配项的组

(?=\])
正向前瞻
]
。匹配以
]
结尾的组,但不将其包含在结果中

完成了

证明

与null提出的解决方案类似。但是不需要附加的
\]
。作为附加说明,在
^
之后,似乎不需要
\
转义
[
。为了可读性,我将保留它


在分隔符相同的情况下不起作用。
“或多或少”
例如。

我想找到一个介于/和#之间的字符串,但#有时是可选的。下面是我使用的正则表达式:

  (?<=\/)([^#]+)(?=#*)

(?以下是我在C#中没有“[”和“]”时的情况:

最新的解决方案

如果您使用的是Javascript,我提出的最佳解决方案是使用
match
而不是
exec
方法。 然后,使用
$1

const text = "This is a test string [more or less], [more] and [less]";
const regex = /\[(.*?)\]/gi;
const resultMatchGroup = text.match(regex); // [ '[more or less]', '[more]', '[less]' ]
const desiredRes = resultMatchGroup.map(match => match.replace(regex, "$1"))
console.log("desiredRes", desiredRes); // [ 'more or less', 'more', 'less' ]

如您所见,这对于文本中的多个分隔符也很有用

这里有一个带有明显分隔符(
X
Y
)的通用示例:


(?“容易做到”,LOL!:)正则表达式总是让我头疼,一旦找到解决我问题的方法,我往往会忘记它们。关于你的解决方案:第一种方法如预期的那样有效,第二种方法不起作用,它一直包含括号。我使用的是C#,也许正则表达式对象有它自己的“味道”对于正则表达式引擎…它这样做是因为您查看的是整个匹配,而不是第一个匹配的组。如果子字符串也包含分隔符,这是否有效?例如在
中,这是一个测试字符串[more[或]less]
是否会返回
more[或]less
?@gnzlbg否,它将返回“more[或”这是返回字符串以及开始字符串和结束字符串谢谢,但是这个解决方案不起作用,它保留了方括号。正如我在对Cletus的解决方案的评论中所写的,可能是C#RegEx对象对它的解释不同。虽然我对C#不是专家,所以这只是一个猜测,也许只是我缺乏知识。)相关:如果字符串中有多个[或多或少]的匹配项,该怎么办?虽然有过查找断言,但如果您有两个集合[],这一个就有问题了。这是一个很好的解决方案,但是我做了一个调整,这样它也会忽略末尾的一个额外的“]”:
[^\[\]+(?=\])
["[more or less]", "more or less"]
var matched = regex.exec(strToMatch)[1];
"more or less"
var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
[^\[]+(?=\])
  (?<=\/)([^#]+)(?=#*)
        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }
more or less
const text = "This is a test string [more or less], [more] and [less]";
const regex = /\[(.*?)\]/gi;
const resultMatchGroup = text.match(regex); // [ '[more or less]', '[more]', '[less]' ]
const desiredRes = resultMatchGroup.map(match => match.replace(regex, "$1"))
console.log("desiredRes", desiredRes); // [ 'more or less', 'more', 'less' ]
(?<=X)(.*?)(?=Y)