Regex 仅当文本不包含其他字符串时匹配字符串

Regex 仅当文本不包含其他字符串时匹配字符串,regex,Regex,我有以下用例。如果字符串的一部分不包含其他字符串,我需要一个正则表达式模式来只匹配一行。以下是一个例子: <androidx.constraintlayout.widget.Barrier android:id="@+id/barrier6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margi

我有以下用例。如果字符串的一部分不包含其他字符串,我需要一个正则表达式模式来只匹配一行。以下是一个例子:

<androidx.constraintlayout.widget.Barrier
        android:id="@+id/barrier6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="12dp"/>
我已经解决了这个问题,我可以使用以下正则表达式来完成:

查找:*android:layout\u margintart=* 替换:$1 ANDROID:LAYOU marginStart=$2\n$1 ANDROID:LAYOU marginLeft=$2


我不能做的是有条件地匹配。如果此xml对象已包含android:layout\u marginLeft属性,我不希望进行匹配。

在正则表达式中,如果要检查以确保在要匹配的部分之后没有出现字符串,可以使用负前瞻

在本例中,您希望匹配某些内容,但前提是以后不会出现字符串布局_marginLeft。您可以这样做,但将layout_marginLeft放入一个负前瞻,如下所示:

(?:(?!layout_marginLeft).)*
(android:layout_marginStart="(.*?)")(?:(?!layout_marginLeft).)*(?=/>)
\1\n\t\tandroid:layout_marginLeft="\2"
现在,当您将其与您实际想要匹配的正则表达式相结合时,会出现如下情况:

(?:(?!layout_marginLeft).)*
(android:layout_marginStart="(.*?)")(?:(?!layout_marginLeft).)*(?=/>)
\1\n\t\tandroid:layout_marginLeft="\2"
然后您的替换字符串将如下所示:

(?:(?!layout_marginLeft).)*
(android:layout_marginStart="(.*?)")(?:(?!layout_marginLeft).)*(?=/>)
\1\n\t\tandroid:layout_marginLeft="\2"
所以,替换内容的工作原理是一样的,只是你告诉它不要替换任何已经包含layout_marginLeft的内容


。可能重复。虽然我知道有另一篇帖子询问有关检查XML标记的问题,但也有一个答案,上面还说,如果这是一次性的事情,那么使用正则表达式执行这样的任务是可以的。谢谢你的回答。非常有用。有没有办法在考试前后都进行检查?所以不匹配:android:layout\u marginLeft=10dp android:layout\u marginRight=10dp。请注意,我添加了单行s标志以跨多行扫描。这也意味着我必须改变计划。在哪?不包括空格。[^\s]*?。最后,我在表达式的前面添加了相同的负面前瞻。现在有两个地方。非常感谢你花时间来修复和解释它。我一个人永远不会做到这一点。对不起,还没有完成。在Java中使用时,我遇到\K字符的问题,因为它不受支持。不知道怎么解决。人们提到使用捕获组,但无法使其发挥作用。你能帮助解决最后一个难题吗?