我看书或在网上搜索,结果说#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
答案 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
项目之间。因此,您不必包含或符号
除非您想匹配文字|
此外,请注意在这些正则表达式中使用贪婪运算符。
它将立即转到字符串的末尾并回溯
直到找到匹配项,超过所有闭包。
(在这种情况下为\]\]>
)