使用正则表达式

时间:2018-09-18 07:54:47

标签: android regex xml

这是用于测试的示例输入字符串

        <TextView
        android:id="@+id/txt_refer_invite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/txt_refer_earn"
        android:layout_marginTop="8dp"
        android:fontFamily="@font/ms500"
        android:gravity="center"
        android:lineSpacingExtra="10sp"
        android:paddingLeft="16.7dp"
        android:paddingRight="16.7dp"
        android:text="@{data.description}"
        android:textColor="@color/color_858585"
        android:textSize="13.3sp"/>

    <TextView
        android:id="@+id/txt_refer_code"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:layout_below="@id/txt_refer_invite"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="22dp"
        android:fontFamily="@font/ms500"
        android:background="@drawable/bg_refer_code"
        android:gravity="center"
        android:text="@{data==null?``:`Invite code : `+data.referralCode}"
        android:textColor="#9c9c9c"
        android:textSize="14.3sp"/>

我想使用正则表达式找出没有android:fontFamily的每个Textview,但不确定如何正确应用否定查找。我正在使用在线正则表达式测试仪的正则表达式是

<TextView[\s\S]*?(?!fontFamily)[\s\S]*?>

但是它返回每个textview(匹配所有textview)

1 个答案:

答案 0 :(得分:0)

<TextView[\s\S]*?(?!fontFamily)[\s\S]*?>模式匹配<TextView,然后匹配任何0+个字符,并尽可能少(因此,首先跳过),然后断言没有fontFamily子字符串立即到达到当前位置的右边,然后匹配任何0+个字符,直到第一个>为止尽可能少(因此,最后一个[\s\S]*?一直扩展到匹配结束)。前瞻不会扮演任何特定的角色(除非fontFamily紧随<TextView之后出现(除非如此)。

如果要将正则表达式用于一次性任务,则需要tempered greedy token

<TextView(?:(?!fontFamily)[^>])*>
         ^^^^^^^^^^^^^^^^^^^^^^^ 

(?:(?!fontFamily)[^>])*部分将匹配任何不以>开头的字符串,但不会启动fontFamily子串的任何字符,直至>

请参见regex demo

您可以使用否定的字符类来解开令牌,以使其更高效:

<TextView[^f>]*(?:f(?!ontFamily)[^f>]*)*>
         *******************************

请参见another regex demo