具有这样的字符串集合:
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结束捕获的过程吗?另外,我无法使用显式或隐式捕获组,因为这些模式会传递到解析器中,解析器在处理它们时会将其转换为非捕获组。
直到最近几天,我才使用过超前/后退模式,而这些东西让我很伤脑筋...
答案 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}|$)
-积极向前看,以确保匹配的文本后跟##
或行$