具有多个OR条件的preg_match_all

时间:2015-07-06 20:08:01

标签: regex preg-match-all

我试图创建一个单一的正则表达式模式来匹配一个字符串,其中2个字段(用逗号分隔)可能是

  • a)空,
  • b)单个词,或
  • c)用反斜杠(\)分隔的2个单词。

这是一个日志文件,其中位置1是源用户名字段,位置2是目标用户字段,但如果存在域名,则两者都可以用反斜杠分隔(域\用户名)

我已经尝试了所有我能想到的东西,可以得到3分中的2分来匹配,但不是所有条件。以下是此字符串可能存在的变体。(something1和something2是在此条件之前和之后发生的已知模式)

  

something1 ,,, something2

     

something1,dstuser,something2

     

something1,dstdomain \ dstuser,something2

     

something1的是,srcdomain \ srcuser ,, something2

     

something1的是,srcdomain \ srcuser,dstdomain \ dstuser,something2

     

something1,srcuser,dstdomain \ dstuser,something2

     

something1,srcuser,dstuser,something2

     

something1,srcuser ,, something2

     

something1的是,srcdomain \ srcuser,dstuser,something2

     

something1的是,srcdomain \ srcuser,dstdomain \ dstuser,something2

例如,我试过这个:

^.*something1,(,|(?J)(?<src_username>[^\\]*),|(?<src_domain>.*?)\\(?<src_username>[^\\]*),).*?,something2*

这匹配当时的某些,但我很好奇是否可以使用单行正则表达式。

提前致谢....

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找这个正则表达式:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="<MyKey>" />

</application>

检查demo

我正在广泛使用否定的字符类(?J)^.*something1,(?:,|(?<src_username>[^,\\]+),|(?<src_domain>[^,\\]+)\\(?<src_username>[^,\\]+),)(?:,|(?<dst_user>[^\\,]+),|(?<dst_domain>[^,\\]+)\\(?<dst_username>[^,\\]*),)something2.* ,以便不会过度匹配并停留在&#34; cell&#34;的范围内。此外,我使用[^,\\]非捕获组来防止捕获的组混乱,并有助于保持输出清洁。