这是用于测试的示例输入字符串
<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)
答案 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>]*)*>
*******************************