Java 使用正则表达式解析

Java 使用正则表达式解析,java,regex,Java,Regex,我有一根像 DELIVERY 'AR_ACTDETAIL_UPD' 'AR_DETAIL_UPD' MODULE TABLE FILTER 'AR_ACT' DEFINE UPDN 'UPDATE' DEFINE REFH 'UPDATE' DEFINE CIT '5000' DEFINE TDB 'TARGET' DEFINE TABLE 'AR_ACTIVITY_DETAIL' ELEMENTS '"POSTING_PERIOD_SID","POSTING_DATE_SID","ACCTG_

我有一根像

DELIVERY 'AR_ACTDETAIL_UPD' 'AR_DETAIL_UPD'
MODULE TABLE
FILTER 'AR_ACT'
DEFINE UPDN 'UPDATE'
DEFINE REFH 'UPDATE'
DEFINE CIT '5000'
DEFINE TDB 'TARGET'
DEFINE TABLE 'AR_ACTIVITY_DETAIL'
ELEMENTS '"POSTING_PERIOD_SID","POSTING_DATE_SID","ACCTG_DOC_CLSS_SID","CUSTOMER_BLLT_SID","AR_ASSET_ACCNT_SID","CO_CNSLDTN_SID","AR_BSNSS_UNT_SID","LOCAL_CURRENCY_AMT","LCL_CUR_DSCNT_AAMT","LCL_CUR_DSCNT_TAMMT","TAXABLE_AMT","NO_TAXABLE_AMT","NO_FOREIGN_TAXABLE_AMT","TAX_CODE","BEFOREINVOICE_SID","ACCNT_BANK_PAYMENT_SID","GAIN_LOSS_LOC_AMT","LOCAL_OPEN_AMOUNT","FOREIGN_OPEN_AMOUNT"'
ELEDEFINE +3 IFNULL '0'
ELEDEFINE +4 IFNULL '0'
ELEDEFINE +5 IFNULL '0'
ELEDEFINE +6 IFNULL '0'

DELIVERY 'AR_DOC_EXINS' 'AR_DOC_EINS'
MODULE TABLE
FILTER 'AR_DOC_EXTNSN_COLS_INS'
DEFINE UPDATE_DETECTION 'UPDATE'
DEFINE REFRESH 'APPEND'
DEFINE COMMIT '5000'
DEFINE TABLEDB 'TARGET'
DEFINE TABLE 'AR_DOC_EXTNSN_COLS'
ELEMENTS '"AR_ACTVSID","DOCUMENT_CO_CD","TRANSACTION_TYP_CD","TRANSACTION_NO","DOCUMENT_SUFFIX_NO","DOC_SFFX_EXTT_NO","INVOICE_MULT","PAYMENT_MULT","ADJUSTMENT_MULT","BAD_DEBT_MULT","SOURCE_INFO","CHG_INVC_PY_STTS_IND","CHG_GROUP_CURRENCY_AMT","CHG_GRP_CUR_DSCNT_AAMT","CHG_GRP_CUR_DSCNT_TAMT","CREATED_DT","CHANGED_DT","ACCOUNT_ID","FI_ACCOUNT_ID"'
ELEDEFINE +2 IFNULL '{$U_DEFAULT_SHORT_CHAR}'
ELEDEFINE +3 IFNULL '{$U_DEFAULT_SHORT_CHAR}'

DELIVERY 'AR_DOC_EXS_UPD' 'AR_DOC__UPD'
MODULE TABLE
FILTER 'AR_DOC_EXTNSN_COLS_UPD'
DEFINE UPDATE_DETECTION 'UPDATE'
DEFINE REFRESH 'UPDATE'
DEFINE COMMIT '5000'
DEFINE TABLEDB 'TARGET'
DEFINE TABLE 'AR_DOC_EOLS'
ELEMENTS '"DOCUMENT_CO_CD","TRANSACTION_TYP_CD","TRANSACTION_NO","DOCUMENT_SUFFIX_NO","DOC_SFFX_EXTNSN_NO","PAYMENT_ID","PAYMETED_DT","CHANGED_DT","AR_ACTVTY_DOC_SID_TMP","ACCOUNT_ID","FI_ACCOUNT_ID","O_GROUP_CURRENCY_AMT","O_GRP_CUR_DSCNT_TAMT","O_GRP_CUR_DSCNT_AAMT"'
ELEDEFINE +1 IFNULL '{$U_DEFAULT_SHORT_CHAR}'
ELEDEFINE +2 IFNULL '{$U_DEFAULT_SHORT_CHAR}'
ELEDEFINE +3 IFNULL '{$U_DEFAULT_NUMBER}'

ALLOW DUPLICATES
交付数量未知,但如果我发现
ALLOW
REJECT
MERGE
AGGREGATE
,则意味着不再有交付。我的想法是将每个
DELIVERY
源代码分开提取(这是存在于两个DELIVERY之间的子字符串或存在于DELIVERY和其中一个单词(ALLOW、REJECT、MERGE、AGGREGATE)之间的子字符串),因此尝试了以下模式:

Pattern p = Pattern.compile("DELIVERY\\s.*?[\\nDELIVERY|\\nALLOW|\\nREJECT|\\nMERGE|\\nAGGREGATE]?",Pattern.DOTALL);
但是它对我不起作用。

Description 此正则表达式将在示例文本中捕获三次交付中的每一次

^delivery(?“[^']*”|。)*?^(?=delivery |聚合|拒绝|允许|合并)

实例 代码

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
  Pattern re = Pattern.compile("^delivery(?:'[^']*'|.)*?^(?=delivery|aggregate|reject|allow|merge)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}
描述 此正则表达式将在示例文本中捕获三次交付中的每一次

^delivery(?“[^']*”|。)*?^(?=delivery |聚合|拒绝|允许|合并)

实例 代码

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
  Pattern re = Pattern.compile("^delivery(?:'[^']*'|.)*?^(?=delivery|aggregate|reject|allow|merge)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}

以下代码应该适用于您:

Pattern p = Pattern.compile("(?s)(\\bDELIVERY\\b.+?(?=\\b(?:DELIVERY|ALLOW|REJECT|MERGE|AGGREGATE)\\b))");
Matcher m = p.matcher(str); // str is your input string
boolean found = false;
while (m.find()) {
    System.out.printf("Deliver: %s%n", m.group(1));
    found = true;
}

if (!found) {
    System.out.println("Didn't Match");
}

以下代码应该适用于您:

Pattern p = Pattern.compile("(?s)(\\bDELIVERY\\b.+?(?=\\b(?:DELIVERY|ALLOW|REJECT|MERGE|AGGREGATE)\\b))");
Matcher m = p.matcher(str); // str is your input string
boolean found = false;
while (m.find()) {
    System.out.printf("Deliver: %s%n", m.group(1));
    found = true;
}

if (!found) {
    System.out.println("Didn't Match");
}


为什么您使用方括号(=字符类)而不是圆括号(=捕获组)?尝试通过转义:
\\[
使您的
\[
文本化:
\[
您想要得到什么?我需要捕获两次交付之间(.*)太赫兹的交付源代码,或者交付与其中一个单词之间的空间(允许、拒绝、合并、聚合)也许一个更完整的传递文本示例和您用于提取信息的完整代码有助于回答以下问题:为什么您使用方括号(=字符类)而不是圆括号(=捕获组)?尝试通过转义使您的
[
文字化:
\\[
你想要得到什么?我需要捕获交付源代码,它是两次交付之间的(.*)太赫兹空间,或者交付和其中一个单词之间的空间(允许、拒绝、合并、聚合)也许一个更完整的传递文本示例和用于提取信息的完整代码有助于回答以下问题:您是如何生成状态图的?我使用的是debuggex.com。尽管它不支持lookbehinds、命名捕获组或原子组,但它仍然便于理解表达式流。还有regexper、 com。它们也做得很好,但在你打字时不是实时的。@Adam抱歉,Adam,没有“”;我把它们放在一起只是为了显示这是一个字符串。你能解释一下(?:)的意思吗?@Mikou
(?:)
是一个非捕获组-一种将事物组合在一起的方法(在这种情况下,我们可以将
*?
量词应用到组中),而不必捕获匹配的子字符串以供以后使用。嘿@denomales,稍微更正一下:如果单击右上角的“PCRE”,debuggex现在支持lookbehinds、命名组和原子组:)您是如何生成状态图的?我使用的是debuggex.com。虽然它不支持lookbehinds、命名捕获组或原子组,但它仍然可以方便地理解表达式流。还有regexper.com。它们也做得很好,但在您键入时不是实时的。@Adam抱歉,Adam,没有“”;我把它们放在一起只是为了表示这是一个字符串。你能给我解释一下(?:)的意思吗?@Mikou
(?:)
是一个非捕获组-一种将事物组合在一起的方法(在这种情况下,我们可以将
*?
量词应用于组)没有捕获匹配的子字符串供以后使用。嘿@denomales,只需稍加更正:如果单击右上角的“PCRE”,debuggex现在支持lookbehinds、命名组和原子组:)感谢anubhava的作品;但请你向我解释一下你的模式,因为我是新使用正则表达式的人,对我来说似乎有点困难。实际上,我的正则表达式非常简单。它正在搜索单词
DELIVERY
,然后搜索一些任意文本,直到我找到任何单词
DELIVERY.\ALLOW.\REJECT.\MERGE.\AGGREGATE
\b
用于单词边界,而
?=
用于正向前瞻。阅读:了解更多详细信息。感谢anubhava的作品;但请您向我解释一下您的模式,因为我是新使用正则表达式的人,对我来说似乎有点困难。实际上,我的正则表达式非常简单。它正在搜索单词
交付
,然后是一些ar按位排列文本,直到我点击任何单词
传递|允许|拒绝|合并|聚合
\b
用于单词边界,
?=
用于正向前瞻。阅读:了解更多详细信息。