Вы можете использовать отрицательный взгляд за спиной :
let regEx = "(?<!((https|http)://))((\\w|-)+)(([.]|[/])((\\w|-)+))+"
Таким образом, с учетом этих строк:
let string1 = "https://www.google.com"
let string2 = "stackoverflow.com/questions/54269877/regex-for-specific-urlfield"
Результат оценки их с тем же предикатом: [117 ]
let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx])
даст ожидаемые результаты:
predicate.evaluate(with: string1) //false
predicate.evaluate(with: string2) //true
Можно использовать strerror()
для получения человекочитаемой строки для кода ошибки. Это - та же строка, распечатанная perror()
, но полезно при форматировании сообщения об ошибке для чего-то другого, чем вывод стандартной погрешности.
, Например:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux также поддерживает явно ориентированный на многопотоковое исполнение вариант strerror_r()
.
Это означает:
Файл или каталог, не найденный.
Когда Вы будете использовать strace (на Linux) для выполнения двоичного файла, он произведет возвраты из системных вызовов и что означает код ошибки. Это может иногда быть полезно для Вас.
Звоните
perror("execl");
в случае ошибки.
Образец:
if(read(fd, buf, 1)==-1) {
perror("read");
}
страницы справочника errno(3)
и perror(3)
интересны, также...
Я использую следующий сценарий:
#!/usr/bin/python
import errno
import os
import sys
toname = dict((str(getattr(errno, x)), x)
for x in dir(errno)
if x.startswith("E"))
tocode = dict((x, getattr(errno, x))
for x in dir(errno)
if x.startswith("E"))
for arg in sys.argv[1:]:
if arg in tocode:
print arg, tocode[arg], os.strerror(tocode[arg])
elif arg in toname:
print toname[arg], arg, os.strerror(int(arg))
else:
print "Unknown:", arg
Вот документация . Это должно сказать Вам, что это означает и что сделать с ними. Необходимо избегать использования числового значения и использовать константы, перечисленные там также, поскольку число может измениться между различными системами.
Существует несколько полезных функций для контакта с errno
с. (Только для прояснения они встроены к libc
- я просто обеспечиваю демонстрационные реализации, потому что некоторые люди находят код чтения более четким, чем чтение английского языка.)
#include <string.h>
char *strerror(int errnum);
/* you can think of it as being implemented like this: */
static char strerror_buf[1024];
const char *sys_errlist[] = {
[EPERM] = "Operation not permitted",
[ENOENT] = "No such file or directory",
[ESRCH] = "No such process",
[EINTR] = "Interrupted system call",
[EIO] = "I/O error",
[ENXIO] = "No such device or address",
[E2BIG] = "Argument list too long",
/* etc. */
};
int sys_nerr = sizeof(sys_errlist) / sizeof(char *);
char *strerror(int errnum) {
if (0 <= errnum && errnum < sys_nerr && sys_errlist[errnum])
strcpy(strerror_buf, sys_errlist[errnum]);
else
sprintf(strerror_buf, "Unknown error %d", errnum);
return strerror_buf;
}
strerror
возвраты строка, описывающая код ошибки, Вы передали ему. Осторожность, это не поток - или безопасный от прерывания; это свободно переписать строку и возвратить тот же указатель на следующем вызове. Используйте strerror_r
, если необходимо волноваться об этом.
#include <stdio.h>
void perror(const char *s);
/* you can think of it as being implemented like this: */
void perror(const char *s) {
fprintf(stderr, "%s: %s\n", s, strerror(errno));
}
perror
распечатывает сообщение, которое Вы даете ему, плюс строка, описывающая ток errno
, к стандартной погрешности.
Код ошибки 2 означает "Файл/Каталог, не найденный". В целом Вы могли использовать функция perror для печати человекочитаемой строки.
Вместо того, чтобы работать perror
на любом коде ошибки Вы добираетесь, можно получить полный список errno
значения в системе со следующей остротой:
cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3