我有一个像这样的输入字符串:
one `two three` four five `six` seven
其中一些部分可以用严重的重音字符(`)包裹。
我想仅匹配未被它包裹的这些部分,例如one
,four five
和seven
(跳过two three
和six
)。
我尝试使用前瞻((?<=)
和(?=)
)来执行此操作,但它识别four five
组two three
和six
。是否有可能仅使用正则表达式解决此问题,或者我必须以编程方式执行此操作? (我正在使用java 1.8)
答案 0 :(得分:1)
如果你确定没有未闭合的反叛,你可以这样做:
((?:\w| )+)(?=(?:[^`]*`[^`]*`)*[^`]*$)
这将匹配:
"one "
" four five "
" seven"
但它有点贵,因为检查线的剩余部分中的反复数量是否可被2整除的前瞻需要O(n^2)
时间来扫描整个字符串。
请注意,无论空白位置在哪里,它都能正常工作,它实际上是反引号,它并不关心反引号的相对位置。如果你不需要这种强大的能力,那么@ anubhava的回答肯定会更高效。
演示:regex101。
答案 1 :(得分:1)
您可以使用前瞻和后视来使用此正则表达式:
#define COMPUTE_LOOP_ITER 200000000
void compute()
{
int p[2];
for (int i = 0; i < COMPUTE_LOOP_ITER; ++i)
{
p[i%2] = i;
}
}
void * thread_recv_message(void * arg)
{
MPI_Comm comm = *(MPI_Comm*) arg;
int flag;
while (1)
{
MPI_Iprobe(1, 0, comm, &flag, MPI_STATUS_IGNORE);
if (flag == 1) break;
sleep(0);
}
MPI_Recv(NULL, 0, MPI_INT, 1, 0, comm, MPI_STATUS_IGNORE);
return NULL;
}
// Returns the compute() time on p0, 0 on others
double test(MPI_Comm comm)
{
int s, p;
double res = 0;
MPI_Comm_rank(comm, &s);
MPI_Comm_size(comm, &p);
if (p != 2)
{
fprintf(stderr, "Requires 2 processes and no more in comm\n");
fflush(stderr);
MPI_Abort(comm, 1);
}
// Pin each process to its own core
int cpuid = sched_getcpu();
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpuid, &cpuset);
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
if (s == 0)
{
pthread_t thr;
pthread_attr_t attr;
// Make sure the new thread is pinned on the same core
pthread_attr_init(&attr);
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
pthread_create(&thr, &attr, thread_recv_message, &comm);
double t1,t2;
t1 = MPI_Wtime();
compute();
t2 = MPI_Wtime();
MPI_Barrier(comm);
res = t2 - t1;
pthread_join(thr, NULL);
}
else // s == 1
{
MPI_Barrier(comm);
MPI_Send(NULL, 0, MPI_INT, 0, 0, comm);
}
MPI_Barrier(comm);
return res;
}
<强>解释强>
(?<!`)\b\w+(?:\s+\w+)*\b(?!`)
答案 2 :(得分:-1)
我通过指定排除关闭字符(在你的情况下为空格)来解决这样的问题:
`[^\s]+`