Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 要交换的单个PCRE正则表达式';0';对于';1';和';1';对于';0';在字符串中的特定位置_Regex_Pcre - Fatal编程技术网

Regex 要交换的单个PCRE正则表达式';0';对于';1';和';1';对于';0';在字符串中的特定位置

Regex 要交换的单个PCRE正则表达式';0';对于';1';和';1';对于';0';在字符串中的特定位置,regex,pcre,Regex,Pcre,我的输入字符串在特定位置具有“0”或“1”。 如果它是“1”,我想用“0”替换它,同样,如果它是“0”,则用“1”替换它 假设“x”永远不会出现,并且我的字符串只是一个字符,我可以用3个正则表达式来实现,如下所示: s/0/x/ s/1/0/ s/x/0/ 但那太乱了。我想知道PCRE是否有什么花哨的东西可以只用一个表达式就能做到这一点 不确定您的用例是什么,但是使用sed呢 echo 'ah1s' | sed 's/0/x/;s/1/0/;s/x/1/' echo 'ah0s' | sed

我的输入字符串在特定位置具有“0”或“1”。 如果它是“1”,我想用“0”替换它,同样,如果它是“0”,则用“1”替换它

假设“x”永远不会出现,并且我的字符串只是一个字符,我可以用3个正则表达式来实现,如下所示:

s/0/x/
s/1/0/
s/x/0/

但那太乱了。我想知道PCRE是否有什么花哨的东西可以只用一个表达式就能做到这一点

不确定您的用例是什么,但是使用sed呢

echo 'ah1s' | sed 's/0/x/;s/1/0/;s/x/1/'
echo 'ah0s' | sed 's/0/x/;s/1/0/;s/x/1/'

你可以用像这样的东西

perl -pe  's/([01])/ 0+!$1 /ge' file
其中,
$1
是捕获的字符串,
产生其否定,并且
0+
强制使用数字上下文。
/g
标志表示处理一行中的每个匹配项,
/e
将替换表达式作为Perl代码进行计算


这里有一个gnu awk命令,用于在给定输入中翻转1到0和0到1:

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "abc1foo0bar"
abc0foo1bar

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "1"
0

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "0"
1

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "foo1"
foo0

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "0bar"
1bar

awk-vrs='[01]'{ORS=xor(RT,1)}1'字符串中存在另一个x不是问题,因为您不需要它:

sed 'y/01/10/' input >output
或没有sed:

tr 01 10 <input >output
tr01 10输出

我是从as Community Wiki的评论中发布这篇文章的,因为我认为这是最好的答案,甚至比我自己发布的答案还要好。

你用什么语言做这件事?使用
grep-p
。我知道pcre在不同语言之间是非常一致的?如果一种语言以不同的方式进行操作,那么pcre不再是真的吗?
s/x/y/
是一种字符串替换操作,在许多编程语言中都受支持。一般来说,它不是正则表达式的特性,特别是PCRE和/或
grep
。正则表达式是一种用于匹配字符串的形式主义,而不是用于修改字符串(尽管有些实现使这种区别变得模糊)。单靠正则表达式是无法做到这一点的。您需要在替换部件中使用回调函数。在php中,这将通过
php\u replace\u callback
函数实现,在python中,这将通过
lambda
函数在
re.sub
中实现。在perl中,这可以通过使用
e
modifier来实现。您需要添加
g
modifier。如果输入字符串中存在
x
,该怎么办?如果你仔细看看这个问题,你会发现给定的假设是“x”不会在输入字符串中出现。字符串中出现另一个x不是问题,因为您不需要它:
sed'y/01/10/'
或没有sed:
tr 01 10
@tripleee:对不起,我不能,因为我必须去市场买兔子。@casimimirithippolyte发布了一个CW答案;如果你改变主意,我就把它拿走。