正则表达式可解析两个没有捕获组且不包括标记的标记之间的字符串

时间:2019-04-03 18:59:51

标签: c# regex

具有这样的字符串集合:

string s1 = "   Identifier1 = Value1                      ## Comment";
string s2 = "   Something = SomeData";
string s3 = "   Name = information\\t\\t\\t## More comments!";
string s4 = "   Nam2 = information";

我需要一个正则表达式模式,该模式将在等号(=)之后直到行尾或##注释标记处捕获行中的所有信息,但不捕获其中任何一个。

分别给我:

" Value1                      "
" SomeData"
" information\\t\\t\\t"
" information"

到目前为止,我已经提出了这个建议:(?<=[=]).+(?=(?>##|$))

这是可行的,因为它设法抓取=号之后的所有文本直到字符串的结尾,但是在有注释标记的情况下它永远不会起作用:##因为它仍然可以抓取直到字符串的结尾,而不是在##停下来。

...并且如果我将模式更改为:(?<=[=]).+(?=##))

然后 only 仅适用于带有注释标记的行(并根据需要在它们之前停下来)。

那么我在做错什么/错过了要在##之前或在EOL结束捕获的过程吗?另外,我无法使用显式或隐式捕获组,因为这些模式会传递到解析器中,解析器在处理它们时会将其转换为非捕获组。

直到最近几天,我才使用过超前/后退模式,而这些东西让我很伤脑筋...

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式(如使用here所示):

static long[] COUNTER_VAR;
static String STRING_VAR[];
final static int TOTAL_FLAGS = 10;



DATA_RECEIVED = new boolean[TOTAL_FLAGS];
COUNTER_VAR = new long[TOTAL_FLAGS];
STRING_VAR = new String[TOTAL_FLAGS];
INDEX_DATA_R = 0;

void increment`enter code here`_DataReceiveIndex(){
    if(INDEX_DATA_R<TOTAL_FLAGS-1) {
        INDEX_DATA_R += 1;
    }else{
        INDEX_DATA_R = 0;
    }
}

public int getCount(final String path) {
    final int cur = INDEX_DATA_R;
    DATA_RECEIVED[cur] = false;
    INDEX_DATA_R++;
    mDatabaseReference.child(path).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            COUNTER_VAR[cur] = dataSnapshot.getChildrenCount();
                DATA_RECEIVED[cur] = true;
            }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    return cur;
}


public boolean setIds() {

    new Thread(new Runnable() {
        @Override
        public void run() {
            int a = getCount(APPOINT_PATH);

            while(!DATA_RECEIVED[a]) {
            }

            total_appointment = COUNTER_VAR[a];
            mDatabaseReference.child("/ID/A").setValue(total_appointment);
       }
   }).start();

}
  • (?<==)(?:(?!#{2}).)* 向后看以确保前面的内容与(?<==)完全匹配
  • =与任意字符(不包括换行符)匹配任意次,直到达到(?:(?!#{2}).)*

答案 1 :(得分:1)

您可以使用此正则表达式,

(?<==).*?(?=#{2}|$)

说明:

  • (?<==)-向后积极看待,以确保匹配的文本前面带有=
  • .*?-以非贪婪的方式匹配任何文本
  • (?=#{2}|$)-积极向前看,以确保匹配的文本后跟##或行$

Demo