Java RegEx:。*和\ s \ S有什么区别?

时间:2019-05-05 16:50:44

标签: java regex regex-group

我看书或在网上搜索,结果说#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <pthread.h> #include <fcntl.h> #include <sys/stat.h> #include <semaphore.h> #include <pthread.h> #include <sys/mman.h> sem_t *s1=NULL; sem_t* s2=NULL; sem_t* s3=NULL; int count=15; void* function(void* arg) { int* nrth=(int*) arg; sem_t * s=NULL; s=sem_open("sem1",O_EXCL); if(s==NULL) perror("Error"); sem_t * s2=NULL; s2=sem_open("sem2",O_EXCL); if(s2==NULL) perror("Error"); sem_t * s3=NULL; s3=sem_open("sem3",O_EXCL); if(s3==NULL) perror("Error"); sem_wait(s); if(count==4) sem_post(s2); printf("BEGIN %d \n",*nrth); if(*nrth==7) sem_wait(s2); sem_wait(s3); printf("END %d \n",*nrth); count--; sem_post(s3); sem_post(s); sem_close(s); sem_close(s2); sem_close(s3); return 0; } int main() { pthread_t threads[16]; int index[16]; sem_unlink("sem1"); sem_unlink("sem2"); sem_unlink("sem3"); s1=sem_open("sem1",O_CREAT,0644,5); if(s1==NULL) perror("ERROR!"); s2=sem_open("sem2",O_CREAT,0644,0); if(s2==NULL) perror("ERROR!"); s3=sem_open("sem3",O_CREAT,0644,1); if(s3==NULL) perror("ERROR!"); init(); for(int i=1; i<=15; i++) { index[i]=i; pthread_create(&threads[i],NULL,function,&index[i]); } for(int i=1; i<=15; i++) { pthread_join(threads[i],NULL); } return 0; } 通常等于.\n\s\S\d\D,表示所有字符。但是现在我想从某个字符串中获取消息,发现只能使用\w\W。我的代码有什么问题?为什么不能使用.\n表达式?

\s\S

2 个答案:

答案 0 :(得分:2)

默认情况下,.模式不匹配行终止符,即\R匹配的行终止符:

  

任何Unicode换行符序列都等效于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

结合两个对手预定义角色类别的[]角色类别将匹配所有角色,例如[\d\D][\h\H][\s\S][\v\V][\w\W][\p{L}\P{L}]

可以通过以下方式之一设置DOTALL标志来更改.模式以匹配所有字符:

// Set flag external from pattern
Pattern.compile(".", Pattern.DOTALL)

// Set flag in the pattern
Pattern.compile("(?s).")

// Set flag in part of pattern
Pattern.compile("(?s:.)")

为方便起见,以下是DOTALL标志的Javadoc:

  

启用dotall模式。

     

在dotall模式下,表达式.与任何字符匹配,包括行终止符。默认情况下,此表达式不匹配行终止符。

     

也可以通过嵌入式标志表达式(?s)启用Dotall模式。 (s是“单行”模式的助记符,在Perl中称为“单行”模式。)

答案 1 :(得分:1)

.点匹配除换行符以外的所有字符。 [\S\s]是具有
的类 一件事的全部和不是那件事的所有事物,
结果是它匹配所有字符

正则表达式下面的代码引用第1组。
我相信您需要在其他2个正则表达式中使用同等的组1。它们是:

1)https://regex101.com/r/Tp1k9m/1

 .* <!\[CDATA\[00000:
 (                             # (1 start)
      (?: . | \n )*            #    Should be *?
 )                             # (1 end)
 \]\]> .* 

2)https://regex101.com/r/FdoHGl/1

 .* <!\[CDATA\[00000:
 (                             # (1 start)
      (?: \s | \S )*           #    Should be *?
 )                             # (1 end)
 \]\]> .* 

3)https://regex101.com/r/t3vVcB/1

 .* <!\[CDATA\[00000:
 (                             # (1 start)
      [\w\W]*                  #    Was [\w|\W], fixed it.
                               #    Should be *?
 )                             # (1 end)
 \]\]> .* 

请注意,在字符类中,存在隐式OR
项目之间。因此,您不必包含或符号
除非您想匹配文字|


此外,请注意在这些正则表达式中使用贪婪运算符。
它将立即转到字符串的末尾并回溯
直到找到匹配项,超过所有闭包。
(在这种情况下为\]\]>